Spring Bean的生命周期

大體上可以分為四個階段:

是的,Spring Bean的生命周期只有這四個階段。把這四個階段和每個階段對應的擴展點糅合在一起雖然沒有問題,但是這樣非常凌亂,難以記憶。要徹底搞清楚Spring的生命周期,首先要把這四個階段牢牢記住。實例化和屬性賦值對應構(gòu)造方法和setter方法的注入,初始化和銷毀是用戶能自定義擴展的兩個階段。在這四步之間穿插的各種擴展點。
1、實例化 Instantiation
2、屬性賦值 Populate
3、初始化 Initialization
4、銷毀 Destruction

實例化 -> 屬性賦值 -> 初始化 -> 銷毀


image.png

①實例化Bean
對于BeanFactory容器,當客戶向容器請求一個尚未初始化的bean時,或初始化bean的時候需要注入另一個尚未初始化的依賴時,容器就會調(diào)用 createBean 進行實例化。對于ApplicationContext 容器,當容器啟動結(jié)束后,通過獲取 BeanDefinition 對象中的信息,實例化所有的bean。

②設置對象屬性(依賴注入):
實例化后的對象被封裝在BeanWrapper 對象中,緊接著,spring根據(jù)BeanDefinition中的信息以及通過BeanWrapper提供的設置屬性的接口完成依賴注入。

③處理Aware 接口:
接著,spring會檢測該對象是否實現(xiàn)了xxxAware接口,并將相關(guān)的xxxAware實例注入給bean:1.如果這個bean已經(jīng)實現(xiàn)了BeanNameAware接口,會調(diào)用它實現(xiàn)的setBeanName(String beanId)方法,此處傳遞的就是spring配置文件中bean的id值;2.如果這個bean已經(jīng)實現(xiàn)了BeanFactoryAware接口,會調(diào)用它實現(xiàn)的setBeanFactory(),傳遞的是spring工廠的自身;3.如果這個bean已經(jīng)實現(xiàn)了ApplicationContextAware接口,會調(diào)用setApplicationContext(ApplicationContext)方法,傳入spring上下文;

④BeanPostProcessor:
如果想對Bean進行一些自定義的處理,那么可以讓Bean實現(xiàn)了BeanPostProcessor接口,那將會調(diào)用postProcessBeforeInitialization(Object obj,String s)方法。

⑤InitializingBean 與 init-method:
如果Bean在spring配置文件中配置了init-method 屬性,則會自動調(diào)用其配置的初始化方法。

⑥如果這個bean實現(xiàn)了BeanPostProcessor接口,將會調(diào)用postProcessAfterInitialization(Object obj,String s)方法;由于這個方法是在Bean初始化結(jié)束時調(diào)用的,所以可以被應用于內(nèi)存或緩存技術(shù);
以上幾個步驟完成后,Bean就已經(jīng)被正確創(chuàng)建了,之后就可以使用這個Bean了。

⑦DisposableBean
當bean不在需要時,會經(jīng)過清理階段,如果bean實現(xiàn)了DisposableBean這個接口,會調(diào)用其實現(xiàn)的destroy()方法;

⑧destroy-method:
最后,如果這個bean的spring配置中配置了destroy-method屬性,會自動調(diào)用其配置的銷毀方法。

  • 總結(jié):創(chuàng)建+初始化一個bean->spring容器管理的bean長期存活-> 銷毀bean
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容