模拟Spring IOC的简易实现
来源:互联网 发布:网络授权商标什么意思 编辑:程序博客网 时间:2024/05/16 23:55
模拟Spring IOC的简易实现
IOC是Inversion of Control的缩写,即控制反转,是一个种面向对象的编程和设计思想。主要目的:解耦
即对象不是自己new出来的,而是由框架来生成的(工厂)。
下面来简单模拟一下Spring获得bean的过程
首先需要一个外部配置的xml以及bean所对应的具体类。
<?xml version="1.0" encoding="UTF-8"?><beans> <bean id="items" class="com.easzz.ioc.Items"/> <bean id="users" class="com.easzz.ioc.Users"> <property name="userName" value="mike"/> </bean></beans>
public interface UniversalApp { void add();}/** * Created by easzz on 2017/8/30 9:46 */public class Users implements UniversalApp { private String userName; @Override public void add() { System.out.println("userName is "+userName); }}/** * Created by easzz on 2017/8/30 9:29 */public class Items implements UniversalApp{ @Override public void add() { System.out.println("item add..."); }}
下面定义一个接口BeanFactory,用于获得bean。
public interface BeanFactory { Object getBean(String id);}
Ioc容器,context,用于存储bean,通过解析xml,使用反射获取其对象,将bean对象和它的id放入一个map中。需要使用的时候get即可。
/** * Created by easzz on 2017/8/30 9:30 */public class XmlContext implements BeanFactory { //bean context private Map<String, Object> context = new HashMap<>(); public XmlContext(String xmlName) { SAXReader saxReader = new SAXReader(); try { Document read = saxReader.read(this.getClass() .getClassLoader().getResourceAsStream(xmlName)); Element rootElement = read.getRootElement(); Iterator iterator = rootElement.elementIterator(); while (iterator.hasNext()){ Element next = (Element)iterator.next(); Object o=null; if ("bean".equals(next.getName())){ String id = next.attributeValue("id"); String className = next.attributeValue("class"); Class<?> aClass = Class.forName(className); Iterator iterator1 = next.elementIterator(); while (iterator1.hasNext()){ Element next1 = (Element) iterator1.next(); if ("property".equals(next1.getName())){ //设置属性值 String name = next1.attributeValue("name"); String value = next1.attributeValue("value"); o = aClass.newInstance(); Field declaredField = aClass.getDeclaredField(name); //允许访问私有属性 declaredField.setAccessible(true); declaredField.set(o,value); declaredField.setAccessible(false); } } context.put(id, o); } } } catch (IllegalAccessException | InstantiationException | ClassNotFoundException | DocumentException | NoSuchFieldException e) { e.printStackTrace(); } } @Override public Object getBean(String id) { return context.get(id); }}
编写测试类
public class Test { public static void main(String[] args){ BeanFactory beanFactory=new XmlContext("beans.xml"); //由Ioc容器帮我们创建对象,注入依赖。 Users users = (Users) beanFactory.getBean("users"); users.add(); }}
输出
userName is mike
正确的获取到了xml里面所定义的bean以及依赖(userName)…
阅读全文
0 0
- 模拟Spring IOC的简易实现
- 简易Spring IOC的实现 tiny spring
- Spring IoC的模拟实现
- spring IOC 简易实现
- 模拟实现Spring IOC
- 模拟spring的IOC
- 模拟Spring的Ioc
- 自己实现的一个简易Spring框架(IoC+AOP)
- spring IOC 机制模拟实现
- spring IOC 机制模拟实现
- 模拟实现Spring IoC功能
- IOC的一种简易实现
- 模拟spring - 简单实现spring IOC
- 利用java反射机制模拟spring IOC原理的实现
- Spring框架的ioc容器核心功能模拟实现
- 模拟实现spring框架的IOC跟AOP功能
- 自己动手模拟spring的IOC
- 简单模拟 Spring 的 ioc
- monkey内存泄漏
- Flask实战2问答平台-首页布局,功能完成
- 第二节:浏览器驱动(webdriver)记录
- ubuntu python 升级
- ssh查询及其安装
- 模拟Spring IOC的简易实现
- 使用grep精确匹配一个单词
- excel最大行数各版本介绍
- MFC 单文档、多文档、对话框程序区分
- mysql sql 语句学习
- Mac 上eclipse 配置Tomcat
- Android Api demo系列(15) (App>Fragment>FragmentAlertDialog高级使用)
- 代码书写规范
- TensorFlow深度学习,一篇文章就够了