SpringIOC容器又被搞了,我tm今天要搞定这个东西
我目前看过最好的讲解是这篇作者的
https://www.jianshu.com/p/4007079cb6c0
Spring
的IoC
容器在实现控制反转和依赖注入的过程中,可以划分为两个阶段:
- 容器启动阶段
Bean
实例化阶段
这两个阶段中,IoC
容器分别作了以下这些事情:
2、IoC容器及IoC容器如何获取对象间的依赖关系
Spring
中提供了两种IoC
容器:
BeanFactory
ApplicationContext
这两个容器间的关系如下图:
这里写图片描述
我们可以看到,ApplicationContext
是BeanFactory
的子类,所以,ApplicationContext
可以看做更强大的BeanFactory
2.我们来看看这两个容器的区别:
BeanFactory是基础的IOC容器:如果没有特殊指定,默认采用延迟初始化策略(lazy-load
)。只有当客户端对象需要访问容器中的某个受管对象的时候,才对该受管对象进行初始化以及依赖注入操作。所以,相对来说,容器启动初期速度较快,所需要的资源有限。
ApplicationContext:在BeanFactory的基础上创建,相对更高级,提供了更多的功能,在启动时就完成所有初始化,容
器启动时间较之BeanFactory
也会长一些。
3、万里长征第一步:加载配置文件信息
我们说BeanFactory容器:
在BeanFactory
容器中,每一个注入对象都对应一个BeanDefinition
实例对象,该实例对象负责保存注入对象的所有必要信息,包括其对应的对象的class类型、是否是抽象类、构造方法参数以及其他属性等。当客户端需要时,容器会通过这些信息返回一个可用的实例
BeanFactory对象从哪里来呢?通过一个专门解析配置文件的类。BeanDefinitionReader他负责读取xml文件并解析,将解析的内容映射到BeanDefinition
4、笼统讲解容器中对象的创建和获取
实现Bean注册的接口是BeanDefinitionRegistry,通过这个接口注册Bean,它要通过BeanDefinition对Bean完成注册。
总结来说就是我们先通过BeanDinfitionReader注册到BeanDefintion中,再通过BeanDefinitionRegistry完成bean的注册