从BeanFactory源码看Bean的生命周期
下图是我搜索“Spring Bean生命周期”找到的图片,来自文章——Spring Bean的生命周期
下面,我们从AbstractAutowireCapableBeanFactory的源码中来分析这张图的各个阶段到底是怎么执行的。BeanFactory的基本源码解读在这篇文章中,如果读本篇文章稍显吃力,可以先去看看上面那篇。
我们所用到的BeanFactory,ApplicationContext基本都继承了
AbstractAutowireCapableBeanFactory,它是一个具有自动装载能力的BeanFactory,它可以响应@Autowire注解,所以,单独分析这个类不是没用的,而且很有必要。同时,由于Spring的BeanFactory层次结构中大量的使用了模板模式,所以我们可能在这个类的父子类中跳入跳出。
Bean生命周期简单描述
- 从BeanDefinition创建实例化Bean
- 实例化之前如果有
InstantiationAwareBeanPostProcessor,调用before实例化方法
- 如果并没有一个实例化BeanPostProcessor接管Bean创建,那么进入正常实例化阶段
- 实例化Bean
- 调用
InstantiationAwareBeanPostProcessor的after实例化方法
- 对pvs进行设置
- 调用
InstantiationAwareBeanPostProcessor的postProcessProperties方法对pvs进行修改
- 实际的Bean属性设置
初始化阶段
InstantiationAwareBeanPostProcessor,调用before实例化方法InstantiationAwareBeanPostProcessor的after实例化方法InstantiationAwareBeanPostProcessor的postProcessProperties方法对pvs进行修改需要注意的是,一旦你的Bean实现了某个Aware接口,就证明它要感知到某些框架中的东西,这会让它直接与框架产生耦合。
BeanPostProcessor before初始化的调用
不过这个图应该画错了,它把DestructionAwareBeanPostProcessors写成了InstantiationAwareBeanPostProcessor。
看看它被调用的构造方法里写了啥:
public DisposableBeanAdapter(Object bean, String beanName, RootBeanDefinition beanDefinition,
List<DestructionAwareBeanPostProcessor> postProcessors, @Nullable AccessControlContext acc) {
this.bean = bean;
this.beanName = beanName;
this.nonPublicAccessAllowed = beanDefinition.isNonPublicAccessAllowed();
// 该Bean是不是可调用的DisposableBean
this.invokeDisposableBean = (bean instanceof DisposableBean &&
!beanDefinition.hasAnyExternallyManagedDestroyMethod(DESTROY_METHOD_NAME));
// destroy方法名
String destroyMethodName = inferDestroyMethodIfNecessary(bean, beanDefinition);
// 和初始化哪里一样,防止destroy方法名和DisposableBean的方法名一样,重复调用
if (destroyMethodName != null &&
!(this.invokeDisposableBean && DESTROY_METHOD_NAME.equals(destroyMethodName)) &&
!beanDefinition.hasAnyExternallyManagedDestroyMethod(destroyMethodName)) {
// 如果Bean是一个AutoClosable并且自定义的销毁方法名也是close的话
this.invokeAutoCloseable = (bean instanceof AutoCloseable && CLOSE_METHOD_NAME.equals(destroyMethodName));
if (!this.invokeAutoCloseable) {
// 如果不是,destroyMethodName就使用用户指定的并解析对应方法
this.destroyMethodName = destroyMethodName;
Method destroyMethod = determineDestroyMethod(destroyMethodName);
// 省略一些destroy method参数设置相关的代码
this.destroyMethod = destroyMethod;
}
}
// 获取beanPostProcessors(filterPostProcessors会过滤掉所有非DestructionAwareBeanPostProcessor的类)
this.beanPostProcessors = filterPostProcessors(postProcessors, bean);
this.acc = acc;
}
这里就是做了一些初始化工作,把需要的成员变量都解析出来,方便后面destroy时使用。
然后我们看看destroy方法:
public void destroy() {
// 调用所有DestructionAwareBeanPostProcessor的postProcessBeforeDestruction
if (!CollectionUtils.isEmpty(this.beanPostProcessors)) {
for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) {
processor.postProcessBeforeDestruction(this.bean, this.beanName);
}
}
// 如果是一个disposableBean,调用它的destroy
if (this.invokeDisposableBean) {
((DisposableBean) this.bean).destroy();
}
// 如果是AutoCloseable(并且自定义销毁方法名也是close),直接调用close
if (this.invokeAutoCloseable) {
((AutoCloseable) this.bean).close();
}
// 否则去调用自定义方法
else if (this.destroyMethod != null) {
invokeCustomDestroyMethod(this.destroyMethod);
}
// 有可能存在destroyMethod没解析,但是destroyMethodName有了的情况,解析并调用
else if (this.destroyMethodName != null) {
Method destroyMethod = determineDestroyMethod(this.destroyMethodName);
if (destroyMethod != null) {
invokeCustomDestroyMethod(ClassUtils.getInterfaceMethodIfPossible(destroyMethod, this.bean.getClass()));
}
}
}
实战DestructionAwareBeanPostProcessor#
- 从BeanDefinition获取Bean信息
- 调用
InstantiationAwareBeanPostProcessor的before实例化方法
- 如果它返回一个对象,那么直接进入该对象的初始化后方法
- 否则,它返回null,进入正常的Bean生命周期
- 实例化Bean
- 调用
populateBean,该方法的目的是对Bean属性进行设置
- 调用
InstantiationAwareBeanPostProcessor的after实例化方法,该方法的返回值决定是否跳过属性设置阶段
- 解析该Bean的pvs,自动注入该pvs
- 调用
InstantiationAwareBeanPostProcessor中两个和属性设置有关的方法,允许它们对属性进行动态修改
- 调用
initializingBean进入初始化阶段
- 检测Bean实现了哪些Aware接口,调用它们
- 调用所有
BeanPostProcessor的before初始化方法,该方法可以返回Bean的一个代理
- 如果Bean是
InitializingBean,调用它的afterPropertiesSet方法
- 如果Bean设置了启动方法,调用启动方法
- 调用所有
BeanPostProcessor的after初始化方法,该方法可以返回Bean的一个代理
- 调用
destroyBean进入Bean销毁阶段
- 创建
DisposableBeanAdapter,它负责对Bean的销毁进行生命周期方法的调用
- 调用所有
DestructionAwareBeanPostProcessor的before销毁方法
- 如果是
DisposableBean,调用destroy方法
- 如果设置了
destroy-method,调用它
参考原文链接:https://www.cnblogs.com/lilpig/p/16477006.html
InstantiationAwareBeanPostProcessor的before实例化方法populateBean,该方法的目的是对Bean属性进行设置InstantiationAwareBeanPostProcessor的after实例化方法,该方法的返回值决定是否跳过属性设置阶段InstantiationAwareBeanPostProcessor中两个和属性设置有关的方法,允许它们对属性进行动态修改initializingBean进入初始化阶段BeanPostProcessor的before初始化方法,该方法可以返回Bean的一个代理InitializingBean,调用它的afterPropertiesSet方法BeanPostProcessor的after初始化方法,该方法可以返回Bean的一个代理destroyBean进入Bean销毁阶段DisposableBeanAdapter,它负责对Bean的销毁进行生命周期方法的调用DestructionAwareBeanPostProcessor的before销毁方法DisposableBean,调用destroy方法destroy-method,调用它