第一部分 Spring核心实现篇
IOC容器(控制反转)
应用控制翻转后,当对象被创建时,由一个调控系统内的所有对象的外界实体将其所依赖的对象的引用传递给它,即依赖被注入到对象中。所以,控制反转是关于一个对象如何获取它所依赖的对象的引用,反转指的是责任的反转。
IOC容器系列的设计与实现:BeanFactory和ApplicationContext
下面我们先看看IOC容器的接口设计图、了解下IOC容器系列的概况
了解到了关于容器的基本工作原理,主要是以下几个方面。
BeanDefinition的定位
- 它为管理POJO之间的依赖关系提供了帮助
- 需要按照Spring的定义规则提供定义信息(常用的是XML的文件格式)
- 在初始化IOC容器的过程中,首先就是要定位到有效的Bean定义信息
- 通过Resource接口来统一这些Bean定义信息,通过ResourceLoader完成。
- 使用上下文例如ApplicationContext,本身提供了定位的功能,因为上下文是DefaultResourceLoader的子类
- 使用BeanFactory作为IOC容器的话,就需要使用相应的Resource来完成Bean信息的定位。
容器的初始化
- 在使用上下文时,需要对它进行初始化的过程,完成初始化以后,这个IOC容器才是可用的。这个过程的入口是在refresh中实现的,这个refresh相当于容器的初始化函数。
- 在初始化过程中,比较重要的部分是对BeanDefiniton信息的载入和注册工作。 相当于在IOC容器中需要建立一个BeanDefinition定义的数据映像,Spring为了达到载入的灵活性,把载入的功能从IOC容器中分离出来,由BeanDefinitionReader来完成Bean定义信息的读取、解析和IOC容器内部BeanDefinition的建立。在DefaultListableBeanFactory中,这些BeanDefinition被维护在一个Hashmap中,以后的IOC容器对Bean的管理和操作就是通过BeanDefinition来完成的
容器的初始化完成之后
- 初始化完成之后,IOC容器的使用就准备好了,但这时只是在IOC容器内部建立了BeanDefiniton,具体的依赖关系还没注入。在第一次向IOC容器请求Bean时,IOC容器才会对相关的Bean依赖关系进行注入。如果需要提前注入。统一通过lazy-init属性进行预实例化。这个预实例化是上下文初始化的一部分,起到提前完成依赖注入的控制作用。在依赖注入完成以后,IOC容器就会保持这些具备依赖关系的Bean供直接使用。这是可以通过getBean来取得Bean,这些Bean不是简单的Java对象,而是已经包含了对象之间依赖关系的Bean。