Spring IoC容器基础元件
BeanDefinition: 该实例负责保存bean对象的所有必要信息,包括bean对象的class类型、是否是抽象类、构造方法和参数、其它属性等等BeanDefinitionRegistry: 抽象出bean的注册逻辑, BeanDefinitionRegistry接口包含registerBeanDefinition、removeBeanDefinition、getBeanDefinition等注册管理BeanDefinition的方法BeanFactory: 抽象出了bean的管理逻辑, BeanFactory接口中主要包含getBean、containBean、getType、getAliases等管理bean的方法
BeanFactory、BeanDefinitionRegistry关系图 如下:
DefaultListableBeanFactory: 通用的BeanFactory实现,它同时也实现了BeanDefinitionRegistry接口,因此它就承担了Bean的注册管理工作
Spring IoC容器的工作流程
- 容器启动阶段(bean对象信息收集验证&其它)
容器启动时,会通过某些途径(代码|XML配置)加载
MateData(元配置数据),BeanDefinitionReader会对加载的MateData进行解析和分析,
并将分析后的信息组装为响应的BeanDefinition, 最后将BeanDefinition注册到相应的BeanDefinitionRegistry
- Bean的实例化阶段
当某个请求通过容器的
getBean方法请求某个对象,或者因为依赖关系容器需要隐式调用getBean时,就会触发第二阶段的活动,容器会首先检查所请求的对象之前是否已经实例化完成。如果没有
则会根据注册的BeanDefinition所提供的信息实例化被请求对象,并为其注入依赖,当该对象装配完毕后,容器会立即将其返回给请求方法使用
BeanFactory只是 Spring Ioc 容器的一种实现,如果没有特殊指定,它采用延迟初始化策略:只有当访问容器中的某个对象时,才对改对象进行初始化和依赖注入操作。ApplicationContext容器在实际场景中使用更多,它构建在BeanFactory之上,属于更高级的容器。除了具有BeanFactory的所有能力之外,还提供对事件监听机制以及国际化的支持等。
它管理的bean, 在容器启动时全部完成初始化和依赖注入
Spring容器扩展机制
BeanFactoryPostProcessor: 允许我们在容器实例化相应对象之前,对注册到容器的BeanDefinition所保存的信息做一些额外的操作,比如修改bean定义的某些属性或者增加其他信息等。BeanPostProcessor: 存在于对象实例化阶段,处理容器内所有符合条件并且已经实例化后的对象 ```java public interface BeanPostProcessor {// 前置处理 @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
// 后置处理 @Nullable default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
} ```
- Bean的实例化过程
postProcessBeforeInitialization()方法与postProcessAfterInitialization()分别对应图中前置处理和后置处理两个步骤将执行的方法。这两个方法中都传入了bean对象实例的引用,为扩展容器的对象实例化过程提供了很大便利,
在这儿几乎可以对传入的实例执行任何操作

如何自定义扩展类
- 实现
org.springframework.beans.factory.config.BeanFactoryPostProcessor接口 - 实现
org.springframework.core.Ordered接口,保证BeanFactoryPostProcessor按照顺序执行
