spring詳解-bean生命周期
Bean生命周期
在經過三篇文章的分析過后,我們對Spring容器的創建過程有了一個大致的認識:
文章一:
SpringBoot啟動run方法分析: https://blog.csdn.net/okok__TXF/article/details/147009731
文章二:
Spring分析-IOC:https://blog.csdn.net/okok__TXF/article/details/147285599
文章三:
Spring分析-AOP:https://blog.csdn.net/okok__TXF/article/details/147397816
我們都知道是在refresh()方法里面進行的,本文就來對Bean的生命周期作一個總結,本文就不探討具體源碼了。
1.bean工廠的后處理器
invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)
通過對該方法的源碼查看調試,我們得知invokeBeanFactoryPostProcessors方法會把所有實現BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的類進行實例化和調用。
BeanDefinitionRegistryPostProcessor :: postProcessBeanDefinitionRegistry()方法:所有常規 bean 定義都已加載,但尚未實例化任何 bean。這允許在下一個后處理階段開始之前添加更多的 bean 定義。也就是說可以增加額外的BeanDefinition。
BeanFactoryPostProcessor :: postProcessBeanFactory()方法:所有 bean 定義都已加載,但尚未實例化任何 bean。這允許覆蓋或添加屬性,甚至允許預先初始化 bean。也就是說可以修改BeanDefinition。
對上面兩個有了這些認識,很顯然就可以知道BeanDefinitionRegistryPostProcessor是先于BeanFactoryPostProcessor 一步執行的。
2.實例化單例
finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)
這個里面我們也是非常有映象了,在AbstractAutowireCapableBeanFactory :: createBean(xx)方法里面:
首先,實例化instanceWrapper = createBeanInstance(beanName, mbd, args);
然后,對指定 bean 的給定合并 bean 定義進行后處理,applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);,這個就是執行MergedBeanDefinitionPostProcessor :: postProcessMergedBeanDefinition(xxx)方法了;
其次,屬性填充populateBean(beanName, mbd, instanceWrapper); 在這個屬性填充里面
//1.給任何 InstantiationAwareBeanPostProcessors 修改 Bean 狀態的機會。
//具體是在屬性填充之前。Spring 容器會遍歷所有注冊的 InstantiationAwareBeanPostProcessor,
//依次調用它們的 postProcessAfterInstantiation 方法。如果任何一個處理器返回 false,
//則后續的屬性填充操作(包括依賴注入和屬性設置)將被跳過
InstantiationAwareBeanPostProcessor :: postProcessAfterInstantiation()
// 2.postProcessProperties
// 例如:字段注入 AutowiredAnnotationBeanPostProcessor
// 處理帶有 @Autowired 和 @Value 注解的字段,根據相應的規則進行依賴注入 --- metadata.inject
InstantiationAwareBeanPostProcessor :: postProcessProperties()
最后,執行初始化exposedObject = initializeBean(beanName, exposedObject, mbd);。
//1.先后順序:BeanNameAware;BeanClassLoaderAware;BeanFactoryAware
invokeAwareMethods(beanName, bean);
//2.Bean初始化前置處理 【@PostConstruct -- CommonAnnotationBeanPostProcessor】
BeanPostProcessor :: postProcessBeforeInitialization();
//3.初始化
/*
InitializingBean :: afterPropertiesSet()
initMethod
*/
invokeInitMethods(beanName, wrappedBean, mbd);
//4.Bean初始化后置處理【例如:生成aop代理對象】
BeanPostProcessor :: postProcessAfterInitialization
大致就是上述四步了。
3.銷毀bean
按照先后順序:
- @PreDestroy 注解方法
- DisposableBean#destroy()
- 自定義 destroy-method
@Component
public class DestoryBeanDemo implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("【DisposableBean 接口】 銷毀");
}
@PreDestroy
public void preDestroy(){
System.out.println("【@PreDestroy 注解】 銷毀");
}
}
執行容器關閉的時候,走這里

public void destroy() {
if (!CollectionUtils.isEmpty(this.beanPostProcessors)) {
for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) {
// 1.@PreDestroy 注解方法
processor.postProcessBeforeDestruction(this.bean, this.beanName);
}
}
...
//2.DisposableBean接口
((DisposableBean) this.bean).destroy();
....
//3.自定義 destroy-method
invokeCustomDestroyMethod
}
end. contact
博客園:http://www.rzrgm.cn/jackjavacpp
微信公眾號:

浙公網安備 33010602011771號