spring是一个框架,所谓IoC
,对于spring
框架来说,就是由spring
来负责控制对象的生命周期和对象间的关系。
Spring
中提供了两种IoC
容器:
BeanFactory
ApplicationContext
我们可以看到,ApplicationContext
是BeanFactory
的子类,所以,ApplicationContext
可以看做更强大的BeanFactory
,他们两个之间的区别如下:
BeanFactory
。基础类型IoC容器
,提供完整的IoC
服务支持。如果没有特殊指定,默认采用延迟初始化策略(lazy-load
)。只有当客户端对象,需要访问容器中的某个受管对象的时候,才对该受管对象进行初始化以及依赖注入操作。所以,相对来说,容器启动初期速度较快,所需要的资源有限。对于资源有限,并且功能要求不是很严格的场景,BeanFactory
是比较合适的IoC容器
选择。ApplicationContext
。ApplicationContext
在BeanFactory
的基础上构建,是相对比较高级的容器实现,除了拥有BeanFactory
的所有支持,ApplicationContext
还提供了其他高级特性,比如事件发布、国际化信息支持等,ApplicationContext
所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成。所以,相对于BeanFactory
来说,ApplicationContext
要求更多的系统资源,同时,因为在启动时就完成所有初始化,容器启动时间较之BeanFactory
也会长一些。在那些系统资源充足,并且要求更多功能的场景中,ApplicationContext
类型的容器是比较合适的选择。
但是我们无论使用哪个容器,我们都需要通过某种方法告诉容器关于对象依赖的信息,只有这样,容器才能合理的创造出对象,否则,容器自己也不知道哪个对象依赖哪个对象;
可以通过以下来告诉spring容器内对象的依赖关系:
- 通过最基本的文本文件来记录被注入对象和其依赖对象之间的对应关系
- 通过描述性较强的XML文件格式来记录对应信息
- 通过编写代码的方式来注册这些对应信息
- 通过注解方式来注册这些对应信息
虽然提供了四种方式,但是我们一般只使用xml
文件方式和注解方式,所以,就重点讲解这两种方式。
加载配置文件信息
1、我们已经知道我们主要通过xml
文件和注解的方式来告诉容器对象间的依赖信息,那么容器怎么才能从xml
配置文件中得到对象依赖的信息呢?
2、在BeanFactory
容器中,每一个注入对象都对应一个BeanDefinition
实例对象,该实例对象负责保存注入对象的所有必要信息,包括其对应的对象的class类型、是否是抽象类、构造方法参数以及其他属性等。当客户端向BeanFactory
请求相应对象的时候,BeanFactory
会通过这些信息为客户端返回一个完备可用的对象实例。
3、 那么BeanDefinition
实例对象的信息是从哪而来呢?这里就要引出一个专门加载解析配置文件的类了,他就是BeanDefinitionReader
,对应到xml
配置文件,就是他的子类XmlBeanDefinitionReader
,XmlBeanDefinitionReader
负责读取Spring
指定格式的XML
配置文件并解析,之后将解析后的文件内容映射到相应的BeanDefinition
。
在我们了解了怎么得到对象依赖的信息,并知道这些信息最终保存在BeanDefinition
之后,我们可能会想,那么容器怎么通过这些信息创造出一个可用的对象了呢?
容器中对象的创建和获取
容器创造一个对象的过程称为Bean的注册
,实现Bean的注册
的接口为BeanDefinitionRegistry
,其实BeanFactory
只是一个接口,他定义了如何获取容器内对象的方法,我们所说的BeanFactory
容器,其实是这个接口的实现类,但是具体的BeanFactory
实现类同时也会实现BeanDefinitionRegistry
接口,这样我们才能通过容器注册对象和获取对象。
我们通过BeanDefinitionRegistry
的rsgisterBeanDefinition(BeanDefinition beandefinition)
方法来进行Bean的注册
。
总结一下一个Bean
是如何注册到容器中,然后被我们获取的:
首先我们需要配置该Bean
的依赖信息,通常我们配置在xml
文件中,然后我们通过XmlBeanDefinitionReader
读取文件内容,然后将文件内容映射到相应的BeanDefinition
,然后我们可以通过BeanFactory
和BeanDefinitionRegistry
的具体实现类,比如DefaultListableBeanFactory
实现Bean
的注册和获取
参考spring ioc系列文章:细说Spring——IoC详解(IoC概览) - 简书