「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」
到这里我们已经把生命周期主流程介绍的差不多了,接下来就是最后一步,执行bean回调方法了:
第三步 - 执行bean初始化回调
所有非懒加载的单例bean创建完之后,调用是SmartInitializingSingleton实现的单例bean的afterSingletonsInstantiated来执行。
// Trigger post-initialization callback for all applicable beans...
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
if (singletonInstance instanceof SmartInitializingSingleton) {
StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
.tag("beanName", beanName);
SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
smartSingleton.afterSingletonsInstantiated();
return null;
}, getAccessControlContext());
}
else {
smartSingleton.afterSingletonsInstantiated();
}
smartInitialize.end();
}
}
总结
Spring的bean生命周期,按照上面的步骤一共分为:
- 读取beanDefinition
- 其实从上面不难看出,BD主要代表的是一个bean的定义,关键的是其中的bean的信息、构造方法等,从而能够很方便地通过BD来构建一个bean
- 初始化bean(createBean)
- 这里就是bean生命周期里的核心了,在这里普通的(没有被提前加载的bean),会在这里被初始化。
- 同时这里也有很多切入点可以让beanPostProcessor来介入,包括:实例化,属性填充
- 调用后置处理器
createBean的流程图:www.processon.com/diagraming/…
- beanPostProcessor有这几个关键子类:
//初始化相关,初始化之前没有的话,createBean的时候就不会先让beanPostProcessor来代理;实例化后也会调这个
final List<InstantiationAwareBeanPostProcessor> instantiationAware = new ArrayList<>();
final List<SmartInstantiationAwareBeanPostProcessor> smartInstantiationAware = new ArrayList<>();
final List<DestructionAwareBeanPostProcessor> destructionAware = new ArrayList<>();
//这里用来处理合并好的beanDefinition
final List<MergedBeanDefinitionPostProcessor> mergedDefinition = new ArrayList<>();
-
BeanPostProcessor在这里有这么几个注入点:
-
InstantiationAwareBeanPostProcessor - 初始化bean(调用postProcessBeforeInstantiation)
- 如果上一步有,beanPostProccssor尝试处理这个bean(调用postProcessAfterInitialization)
- 处理BD:beanPostProcessor(MergedBeanDefinitionPostProcessor)来处理BD(postProcessMergedBeanDefinition)
- InstantiationAwareBeanPostProcessor:填充属性postProcessAfterInstantiation,这里针对的是bean级别的而不是依赖级别的
- InstantiationAwareBeanPostProcessor:循环调用postProcessProperties处理属性,这里是@Autowired的作用的地方,针对的是bean中的依赖级别的
-