Bean 的生命周期包括「实例化-属性填充-初始化-销毁」,在这几个阶段中 BeanPostProcessor
将贯穿其中,在这里记录一下相关的知识点。
几个重要的阶段
- 实例化(得到一个还没有经过属性填充跟初始化的对象)
- 属性填充(得到一个经过了属性填充但还没有初始化的对象)
- 初始化(得到一个经过了初始化但还没有经过
AOP
的对象,AOP
会在后置处理器中执行) - 销毁(在容器关闭时,回调相关的销毁方法)
生命周期流程图
BeanPostProcessor 的干预
BeanPostProcessor 类图
执行顺序
1.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
在目标对象实例化之前调用,可以用这个方法的返回值替代原本改生成的目标对象的实例(一般都是代理对象)。如果该方法的返回值不为空,后续只有 postProcessAfterInitialization 方法会被执行,其他的方法不再执行,否则按正常流程走。
AbstractAutowireCapableBeanFactory#createBean
...
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
2.SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors
检测 Bean 的构造器,用于实例化操作。
AbstractAutowireCapableBeanFactory#createBeanInstance
...
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
3.MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
在目标对象实例化之后,属性填充之前调用,用于修改合并之后的 BeanDefinition。
AbstractAutowireCapableBeanFactory#doCreateBean
...
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
4.InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
在目标对象实例化之后,属性赋值之前执行。如果返回 false 则会忽略属性填充,默认返回 ture,会按照正常流程设置属性值。
AbstractAutowireCapableBeanFactory#doCreateBean
...
populateBean(beanName, mbd, instanceWrapper);
5.InstantiationAwareBeanPostProcessor#postProcessProperties
Spring 5.1 新加的方法,用来修改属性值。
AbstractAutowireCapableBeanFactory#doCreateBean
...
populateBean(beanName, mbd, instanceWrapper);
6.InstantiationAwareBeanPostProcessor#postProcessPropertyValues
也是用来修改属性值,Spring 5.1 开始被废弃,只有在上一步 postProcessProperties
方法返回为 null 的情况下才会执行。
AbstractAutowireCapableBeanFactory#doCreateBean
...
populateBean(beanName, mbd, instanceWrapper);
7.BeanPostProcessor#postProcessBeforeInitialization
在初始化方法之前执行
AbstractAutowireCapableBeanFactory#doCreateBean
...
exposedObject = initializeBean(beanName, exposedObject, mbd);
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
8.invokeInitMethods
初始化,执行 afterPropertiesSet
或自定义的初始化方法
AbstractAutowireCapableBeanFactory#doCreateBean
...
exposedObject = initializeBean(beanName, exposedObject, mbd);
invokeInitMethods(beanName, wrappedBean, mbd);
9.BeanPostProcessor#postProcessAfterInitialization
在初始化方法之后执行(FactoryBean 中获取的对象只有这个方法会起作用,postProcessBeforeInitialization
以及 afterPropertiesSet
或者自定义的初始化方法都不会起作用,因为工厂 bean 提供的是实例对象,已经完成初始化操作了)
AbstractAutowireCapableBeanFactory#doCreateBean
...
exposedObject = initializeBean(beanName, exposedObject, mbd);
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
10.DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
bean 销毁之前执行,前提是requiresDestruction
方法必须返回true才会生效
org.springframework.beans.factory.support.DisposableBeanAdapter#destroy