本文僅供學習交流使用,侵權必刪。
不作商業用途,轉載請注明出處
Spring Bean生命周期細分為以下階段:
我將Bean的生命周期理解為由兩個主要過程組成:創建過程以及銷毀過程。
源碼閱讀
Bean創建過程
Bean創建過程的代碼入口在AbstractAutowireCapableBeanFactory的createBean方法。
Bean實例化過程
實例化前階段
-
實例化前階段是在AbstractAutowireCapableBeanFactory的resolveBeforeInstantiation中執行。
resolveBeforeInstantiation -
其中這里的applyBeanPostProcessorsBeforeInstantiation方法是執行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation回調方法。
applyBeanPostProcessorsBeforeInstantiation - 這里需要注意的是如果InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法返回的是一個not null對象。beanFactory會直接通過applyBeanPostProcessorsAfterInitialization方法執行Bean初始化后置階段,中間的所有bean生命周期過程都會跳過。
實例化階段
-
AbstractAutowireCapableBeanFactory的doCreateBean方法中,createBeanInstance方法就是bean實例化代碼,這個方法會根據對應beanDefinition的定義使用不同的策略進行bean的實例化操作:工廠方法、構造器自動注入方法以及普通實例化方法
doCreateBean
實例化后階段
-
doCreateBean中的populateBean方法中除了Bean的賦值操作之外,其實還包含了實例化后階段操作,以下是populateBean中具體的實例化后階段的代碼執行,這里是通過遍歷方式執行InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation回調方法
populateBean中實例化后階段代碼段
Bean賦值階段
賦值前階段
-
Bean的賦值前階段同樣是在populateBean中完成,這里以遍歷方式執行InstantiationAwareBeanPostProcessor的postProcessProperties回調方法
populateBean中賦值前階段代碼段
賦值階段
populateBean中的applyPropertyValues是Bean的賦值階段操作核心方法,這里是將BeanDefinition中的PropertyValue賦值給Bean實例
Bean初始化階段
AbstractAutowireCapableBeanFactory的initializeBean方法是Bean初始化階段的入口invokeAwareMethods
Aware接口回調
-
進入到initializeBean方法后首先會看到Aware接口回調的入口
initializeBean的Aware接口回調 -
invokeAwareMethods會依次回調BeanNameAware、BeanClassLoaderAware以及BeanFactoryAware
invokeAwareMethods
Bean初始化前階段
-
在執行完Aware接口回調后,就會執行applyBeanPostProcessorsBeforeInitialization進行初始化前階段的操作了
initializeBean的初始化前階段 -
applyBeanPostProcessorsBeforeInitialization以遍歷方式執行BeanPostProcessor的postProcessBeforeInitialization回調方法。
其中這里會調用的InitDestroyAnnotationBeanPostProcessor的postProcessBeforeInitialization方法(通過子類CommonAnnotationBeanPostProcessor調用),此方法會回調@PostConstruct標記的初始化方法
applyBeanPostProcessorsBeforeInitialization
Bean初始化階段
- 在執行完Bean初始化前階段操作后,就是執行invokeInitMethods進行初始化階段的操作了
-
在invokeInitMethods初始化階段中,如果Bean實現了InitializingBean接口,首先會先執行InitializingBean的afterPropertiesSet方法,如下圖
InitializingBean接口方法調用 -
然后就會執行BeanDefinition中的自定義初始化方法,如下圖
BeanDefinition自定義方法執行
Bean初始化后階段
-
執行完invokeInitMethods后,就會調用applyBeanPostProcessorsAfterInitialization,執行Bean初始化后階段操作,如下圖
image.png -
在applyBeanPostProcessorsAfterInitialization中以遍歷方式回調BeanPostProcessor的postProcessAfterInitialization方法
applyBeanPostProcessorsAfterInitialization
Bean初始化完成階段
- Bean初始化完成階段是4.1版本才出現的,所以4.1之前的framework代碼中是沒有這個階段的操作。
-
這里注意需要Bean類實現SmartInitializingSingleton接口的afterSingletonsInstantiated方法
初始化完成代碼段
Bean銷毀階段
Bean的銷毀方法可以通過容器關閉的方法一步步進入到里面看到,單例Bean的銷毀過程主要在DisposableBeanAdapter類的destroy方法中執行,在DefaultSingletonBeanRegistry(AbstractBeanFactory的父類)中會有一個集合存放這這些DisposableBeanAdapter,每個Bean對應一個DisposableBeanAdapter實例
Bean銷毀前階段
-
其中銷毀前階段是通過DisposableBeanAdapter類以遍歷方式回調DestructionAwareBeanPostProcessor的postProcessBeforeDestruction方法
image.png -
其中@PreDestroy標記的銷毀方法是在這里通過InitDestroyAnnotationBeanPostProcessor(DestructionAwareBeanPostProcessor的實現類)的postProcessBeforeDestruction方法進行回調操作
image.png
Bean銷毀階段
-
完成了Bean的銷毀前階段操作后,在DisposableBeanAdapter的destroy方法中,會調用DisposableBean的destroy方法,如下圖:
調用DisposableBean接口方法的代碼段 -
緊接著又會通過invokeCustomDestroyMethod調用BeanDefinition中定義的自定義銷毀方法,如下圖
調用自定義銷毀方法的代碼段
總結
Bean的生命周期主要分為創建過程和銷毀過程。創建又分為實例化前置階段、實例化階段、實例化后置階段、賦值前置階段、賦值階段、初始化前置階段、初始化階段、初始化后置階段、初始化完成階段。銷毀又分為銷毀前置階段以及銷毀階段
Bean的生命周期設計里面,Spring開發人員留了多個擴展接口讓用戶能干預Bean創建和銷毀。但是需要注意的是開發人員要了解每個擴展接口的執行順序以及里面的一些代碼細節,才能更好地使用這些擴展接口在日常開發上。