手把手写一个简单IOC(基于XML配置文件)
Spring IoC容器的实现原理:工厂模式 + 解析XML + 反射机制。
创建模块
采用Maven方式新建Module:myIocSpring
引入dom4j和jaxen的依赖,因为要使用它解析XML文件,还有junit依赖。
准备测试阶段测试用的Bean
这里我们准备2个bean,一个是学生类,一个是班级类,在本文中我们就书写简单的ref和基本数据类型的IOC(即使用value给简单属性赋值。使用ref给非简单属性赋值。)。放在com.study包下
准备测试阶段测试用的XML配置文件:IOC.xml文件放在类路径当中即可,我们这里把文件放到类的根路径下。
这时的目录结构如下:
编写ApplicationContext接口
ApplicationContext接口中提供一个getBean()方法,通过该方法可以获取Bean对象。
编写ClassPathXmlApplicationContext
ClassPathXmlApplicationContext是ApplicationContext接口的实现类。该类从类路径当中加载myspring.xml配置文件。
采用Map集合存储Bean
采用Map集合存储Bean实例。Map集合的key存储beanId,value存储Bean实例。Map<String,Object>在ClassPathXmlApplicationContext类中添加Map<String,Object>属性。并且在ClassPathXmlApplicationContext类中添加构造方法,该构造方法的参数接收myspring.xml文件。同时实现getBean方法。
解析配置文件实例化所有Bean
在ClassPathXmlApplicationContext的构造方法中解析配置文件,获取所有bean的类名,通过反射机制调用无参数构造方法创建Bean。并且将Bean对象存放到Map集合中。
解析配置文件实例化所有Bean
测试阶段1(实例化bean)
通过测试Bean已经实例化成功了,属性的值是null,因为我们调用的都是无参构造方法,所以属性值都是默认值,接下来给bean赋值即可。
Bean的属性赋值
通过反射机制调用set方法,给Bean的属性赋值。
对每个bean标签下的所有property 标签,对标签内容进行解析,这里需要注意点的是判断是引用数据类型还是简单数据类型。
思考:为什么不在上面的循环中给Bean的属性赋值,而在这里再重新遍历一次呢?
解答:很简单为了解决循环依赖问题,先生成bean对象进行曝光再赋值,实例化和属性赋值分开。
测试阶段2(为bean对象进行赋值)
到这里一个简单的IOC已经实现,只实现的基本数据类型和ref类型。还是不能对LIst map等类型进行注入。
- 点赞
- 收藏
- 关注作者
评论(0)