Bean 的生命周期

Bean 的生命周期

Bean 的生命周期包括「实例化-属性填充-初始化-销毁」,在这几个阶段中 BeanPostProcessor 将贯穿其中,在这里记录一下相关的知识点。

几个重要的阶段

  • 实例化(得到一个还没有经过属性填充跟初始化的对象)
  • 属性填充(得到一个经过了属性填充但还没有初始化的对象)
  • 初始化(得到一个经过了初始化但还没有经过 AOP 的对象,AOP 会在后置处理器中执行)
  • 销毁(在容器关闭时,回调相关的销毁方法)

生命周期流程图

Bean 生命周期

BeanPostProcessor 的干预

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