自己实现Spring IoC容器(一)概述
2017-04-07 23:35
246 查看
为什么要自己实现Spring IoC容器
之前我实现了一个精简版的Struts2,说到为什么要自己实现框架,原因我在自己实现Struts2中有说到,这里便不再重复说了,而这次我要来实现一下Spring中IoC容器,所以注意了,什么AOP、事务之类的东西是没有的,只是实现一下IoC容器。什么是IoC
IoC的全称是Inverse of Control,翻译过来就是控制反转。关于IoC的解释网上有很多了,不过我还是想说一下自己的理解,大家看看有没有道理。控制反转可以分为“控制”和“反转”,那我先来说一下控制。比如说有一个B类对象需要用到A类对象来完成一定的功能,则可以说B类对象依赖(记住这个依赖,下面的依赖注入说的就是它)于A类对象,那B要怎么得到A呢,一般来说我们可以直接在B中创建一个A对象,那么问题来了,如果是直接创建A对象的话那就是耦合了,有可能A只是一个接口,有着各种不同的实现类,这样子要换一个实现类,就必须修改B的源代码了,这个时候我们可以说A对象的创建控制权在B手中。
那反转的意思便是把创建对象的控制权转交给别人,在Spring中这个别人就是IoC容器,IoC容器帮你创建好你依赖的对象。那么问题又来了,把创建依赖对象的控制权交给了别人,那要怎么获得别人创建好的对象呢。这时候就有个依赖注入(Dependency Injection)的东西,就是把你依赖的对象通过setter方法又或者构造器给你注入进来。
下面具体弄个例子,有一个B类,需要A类对象来完成一个
getAName方法
A类
package edu.jyu.bean; public class A { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
B类
package edu.jyu.bean; public class B { private A a; public A getA() { return a; } public void setA(A a) { this.a = a; } public String getAName(){ return a.getName(); } }
那我们可以在Spring的配置文件
applicationContext.xml中进行下面的配置,将A对象注入到B中
<bean name="A" class="edu.jyu.bean.A" scope="singleton"> <!-- 让A中的name属性的值为Jason --> <property name="name" value="Jason"></property> </bean> <bean name="B" class="edu.jyu.bean.B" scope="prototype"> <property name="a" ref="A"></property> </bean>
测试类
package edu.jyu.test; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; import edu.jyu.bean.B; public class Test { public static void main(String[] args) { BeanFactory factory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); B b = (B) factory.getBean("B"); System.out.println(b.getAName()); } }
输出结果
Jason
通过上面的例子可以看出A对象的创建是交给Spring的IoC容器完成的
要实现的内容
我自己实现的IoC容器可以说跟Spring中的IoC关系不大,只是根据IoC的原理简单地实现一下。下面来看看我们要实现那些模块以及IoC容器的工作流程。先贴上一张图
根据上面的图可以看出IoC容器工作的步骤
先是创建容器
ClassPathXmlApplicationContext
容器通过
ConfigurationManager来读取配置文件
applicationContext.xml中的信息
然后容器根据配置文件的信息初始化容器即创建需要创建的bean。
用户通过
getBean方法传入一个bean的name来获取对应的bean对象。
所以我要实现的东西就是上图里面的,没有太多的功能,也不是很难。
相关文章推荐
- 自己实现Spring IoC容器(三)完成IoC容器
- 自己实现Spring IoC容器(二)读取配置文件
- 自己实现Spring IoC容器(四)IoC容器的Bug
- 模拟容器的Iterator实现,让自己的类能够使用for-each
- STL库实现之(0)——容器概述
- 自己实现一个IOC(控制翻转,DI依赖注入)容器
- 动手实现自己的 STL 容器 《1》---- vector
- 实现自己的C++ STL--vector容器
- 自己实现IoC,AOP容器
- 【STL源码剖析读书笔记】自己实现Heap算法之MyHeap(底层容器用vector)
- 【STL源码剖析读书笔记】自己实现Heap算法之MyHeap(底层容器用vector)
- 自己实现简单Spring Ioc
- 自己动手实现spring ioc
- 动手实现自己的 STL 容器 《1》---- vector
- 动手实现自己的 STL 容器 《1》---- vector
- spring源码初步学习-自己实现的ioc容器结构
- 在Android中,可以自定义类,继承ViewGroup等容器类,以实现自己需要的布局显示。
- Spring IOC容器的实现
- 动手实现自己的 STL 容器《2》---- list
- Spring IOC之容器实现过程