Spring IOC容器的实现原理
1 概述
1.1 依赖反转模式
在Java中,一个复杂的功能一般都需要由两个或者两个以上的类通过彼此合作来实现业务逻辑的,这使得每个对象都需要与其合作的对象的引用。如果这个获取依赖对象的过程需要自己去实现,那么这将导致代码的高度偶尔并且难以测试。
依赖反转就是对象依赖关系的管理被反转了(获取依赖对象的方式进行了反转),以前是自己主动获取依赖对象,现在是通过框架或者IOC容器将依赖对象注入进来(也可以称之为依赖注入),将依赖对象的管理转到了框架或者IOC容器中,极大了降低了代码之间的耦合性。
1.2 IOC中的注入方式
常见的有接口注入,setter注入和构造器注入三种方式;
相对而言,使用Spring时setter注入是常见的注入方式。
2. IOC容器的设计与实现:BeabFactory和ApplicationContext
Spring IOC 容器的设计中,主要由两个容器系列
一个是实现BeabFactory接口的简单容器系列,只实现了容器的基本功能;
一个是ApplicationContext应用上下文,作为容器的高级形态而存在,增加了许多面向框架的特性;
2.1 IOC容器的设计
上图是IOC容器的接口设计图,主要包括两条设计主线:
从BeabFactory接口到HierarchicalFactory接口,再到ConfigurableBeanFactory接口,这是一条主要的BeanFactory设计路线:
在这条设计路线中,BeabFactory定义的容器的基本功能,HierarchicalFactory增加了getParentBeanFactory()的接口功能,使得容器具有双亲IOC容器的管理功能;ConfigurableBeanFactory主要定义了一些对BeabFactory的配置功能。
第二条设计路线是以ApplicationContext接口为核心的接口设计:
在这个接口设计中,通过ListableBeanFactory和HierarchicalFactory连接BeabFactory和ApplicationContext接口定义,ApplicationContext还通过继承MessageResource接口、ResourceLoder接口和ApplicationEventPublisher接口,添加了许多对高级容器的特性支持。
DefaultListableBeanFactory 是ConfigurableBeanFactory的一个实现类,它作为一个默认的功能完整的IOC容器实现,其他的高级容器都是在它的基础上进行扩展;
2.2 BeabFactory的应用场景
BeabFactory提供最基本的IOC容器功能,这些功能定义都可以在接口中看到。
XmlBeabFactory是DefaultListableBeanFactory 的子类,它是一个以读取xml文件方式定义bean的容器。