插手“容器的启动”——BeanPostProcessor 篇
Spring的IoC容器在实现的时候,存在容器启动阶段和Bean实例化阶段。
Spring充分运用了这两个实现阶段的不同特点,在每个阶段都加入了相应的容器扩展点,以便我们可以根据具体场景的需要加入自定义的扩展逻辑。
本文着重于Spring启动过程中的Bean实例化阶段(createBean阶段)
Spring提供了一种叫做BeanPostProcessor的容器扩展机制,那么我们该如何去扩展呢?
下边是涉及到的processors
- InstantiationAwareBeanPostProcessor extends BeanPostProcessor
- MergedBeanDefinitionPostProcessor extends BeanPostProcessor
- BeanPostProcessor
createBean源码分析
源码太长,我总结成了以下的步骤图
.jpg)
从图可以看出,执行顺序大致如下
- 执行
bean = InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation,bean如果为null,走3,不为null,走2 - 代理对象生成后 执行
BeanPostProcessor.postProcessAfterInitialization注意这里不是InstantiationAwareBeanPostProcessor,执行完直接返回Bean,方法结束 - 没有代理对象,则直接创建对象。此时属性未赋值,此处使用策略模式,正常情况下走
SimpleInstantiationStrategy.instantiate,如果存在方法注入,走spring的cglib的代理 - 执行
MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition - 此时对象创建完成,执行
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation pvs =InstantiationAwareBeanPostProcessor.postProcessProperties如果pvs为空,pvs=InstantiationAwareBeanPostProcessor.postProcessPropertyValues- 在init之前执行
BeanPostProcessor.postProcessBeforeInitialization - init,执行初始化方法,包括
init-method和继成InitializingBean - 在
init之后执行``BeanPostProcessor.postProcessAfterInitialization` - 返回
Bean
这里根据单词可以稍微对记忆有些帮主
- Instantiation 实例化
- Initialization 初始化
我们知道bean是先实例化再初始化的,所以大致顺序是
- postProcessBeforeInstantiation
- postProcessAfterInstantiation
- postProcessBeforeInitialization
- postProcessAfterInitialization