本文最后更新于:2024年4月22日 下午
通过源码了解到整个生命周期中,有三种类型的 生命周期增强器 BeanFactoryPostProcessor(Bean工厂增强),BeanPostProcessor(Bean后置处理器)以及InitializingBean(初始化Bean增强),本章节分析这些增强器是如何干预生命周期的
前言
🎉BeanFactoryPostProcessor:后置增强工厂
🎨BeanPostProcessor: 后置增强组件,实现类很多,在于改变原有对象
✨InitializingBean: 组件初始化之后进行后续增强,与BeanPostProcessor不用的是,InitializingBean在于额外处理,因为这里不会传入当前对象的任何额外信息
实际工作面试中,考察对Spring的了解程度,其本质上是对多少种处理器了解
准备工作
我们这里去实现了许多的PostProcessor,依次打入断点还是源头打入断点调试堆栈信息
使用 ComponentScan 来扫描注解@Componment
堆栈分析
类型一:BeanFactoryPostProcessor类型的工厂后置处理器
BeanFactoryPostProcessor 代码入口
AnnotationConfigApplicationContext refresh()
invokeBeanFactoryPostProcessors 为BeanFactoryPostProcessors核心入口方法,发生在BeanFactory创建之后
BeanFactoryPostProcessor注册
refresh() 中的 invokeBeanFactoryPostProcessors 方法就是执行所有BeanFactory 后置增强器
BeanFactoryPostProcessor执行
执行invokeBeanFactoryPostProcessors 核心逻辑
这里首先会判断 是否实现BeanDefinitionRegistry 接口。
里面分三种
1、实现 PriorityOrdered 顺序优先级最高
2、Ordered顺序,低于PriorityOrdered
3、普通未实现顺序接口
按照这样的顺序去调用 invokeBeanFactoryPostProcessors ,就是接口的根方法
顺序都是数字越小,优先级越高
invokeBeanFactoryPostProcessors 中会循环调用相关接口的方法
实例分析
ConfigurationClassPostProcessor
就是通过实现BeanDefinitionRegistryPostProcessor,扫描配置类及其相关注解,如@Componment @componmentScan 来将这些信息封装为BeanDefinition以供后续创建bean的定义信息
类型二:BeanPostProcessor类型为Bean的后置处理器增强
BeanPostProcessor的注册
refresh()方法中的registerBeanPostProcessors(beanFactory) 入口
流程如上,和BeanFactoryPostProcessor 大致逻辑类似整个流程完成注册
BeanPostProcessor执行
由于各种类型的BeanPostProcessor在Bean的生命周期干扰的时机不同,所以执行的时机也是不同的,这里我们会分别针对各个子类BeanPostProcessor接口代码分析干扰的时机
SmartInstantiationAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor
MergedBeanDefinitionPostProcessor
类型三:InitializingBean 完成bean 初始化后的操作
堆栈方法追踪:getBean->doGetBean->getSingleton->createBean->doCreateBean->initializeBean->invokeInitMethods
bean 完成之后会执行InitializingBean.afterPropertiesSet
整个生命周期流程后置处理器干扰图