spring Bean的生命周期

用了好久的spring,對(duì)bean的生命周期一直 一知半解。今天百度谷歌詳細(xì)了解了下,在此做個(gè)整理。

bean的生命周期

下面是我畫的一個(gè)粗略的流程圖

spring bean生命周期.png

下面介紹幾個(gè)關(guān)鍵的接口

1. BeanFactoryPostProcessor

這個(gè)接口只有一個(gè)實(shí)現(xiàn)方法,它只有一個(gè)方法postProcessBeanFactory。

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

spring會(huì)在構(gòu)造完beanFactory后執(zhí)行這個(gè)方法(所有的bean尚未初始化),這時(shí)候如果我們想對(duì)beanFactory進(jìn)行修改,就可以實(shí)現(xiàn)這個(gè)方法。
注意,如果在BeanFactoryPostProcessor中注入其他的bean對(duì)象,這些對(duì)象會(huì)提前初始化,但是初始化前后不會(huì)調(diào)用BeanPostProcessor接口的對(duì)應(yīng)方法

2. BeanPostProcessor

再來(lái)看看BeanPostProcessor類,在BeanFactoryPostProcessor 的postProcessBeanFactory被執(zhí)行后,實(shí)現(xiàn)BeanPostProcessor接口的對(duì)應(yīng)類就會(huì)被構(gòu)造了。我們?cè)賮?lái)看看這個(gè)接口的兩個(gè)方法:

Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

方法名寫的很明確了,postProcessBeforeInitialization在bean初始化前會(huì)被調(diào)用,postProcessAfterInitialization在bean初始化后會(huì)被調(diào)用。
- 注意,初始化不是調(diào)用構(gòu)造器構(gòu)造類,這里的初始化指的是 bean調(diào)用InitializingBean的初始化方法或者調(diào)用 <init-method>方法來(lái)完成初始化。所以postProcessBeforeInitialization和postProcessAfterInitialization方法是在這兩個(gè)執(zhí)行前后執(zhí)行的。
BeanPostProcessor的兩個(gè)方法對(duì)所有bean都會(huì)起作用,也就是說(shuō),spring容器有幾個(gè)bean,就會(huì)調(diào)用幾次方法

3. InstantiationAwareBeanPostProcessor

這個(gè)接口其實(shí)就是 BeanPostProcessor 的擴(kuò)展。多增加了bean實(shí)例構(gòu)造前后執(zhí)行的方法,和注入屬性前執(zhí)行的方法。
它比BeanPostProcessor多了下面這3個(gè)方法。

Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;
boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;
PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException;
4. Aware 接口

如果bean 實(shí)現(xiàn)了BeanNameAware,BeanFactoryAware等接口,在注入完屬性后會(huì)調(diào)用相應(yīng)的接口方法。
比如BeanNameAware的setBeanName方法。BeanFactoryAware的setBeanFactory方法。

spring代碼中關(guān)于aware的調(diào)用.png

還有一個(gè)ApplicationContextAware接口也會(huì)在后面調(diào)用。

5. InitializingBean

如果bean實(shí)現(xiàn)了這個(gè)接口,那在bean注入屬性完成后會(huì)執(zhí)行對(duì)應(yīng)的afterPropertiesSet方法。

6. DisposableBean

如果bean實(shí)現(xiàn)這個(gè)接口,那銷毀的時(shí)候就會(huì)執(zhí)行destroy方法。

下面總結(jié)一下

為了便于記憶,我們可以把上面的生命周期涉及到的類和接口歸成3大類。

  1. 針對(duì)bean容器級(jí)別,也就是BeanFactoryPostProcessor這個(gè)接口,這個(gè)是在bean工廠構(gòu)造后執(zhí)行對(duì)應(yīng)的方法。
  2. 針對(duì)所有bean級(jí)別,涉及所有bean構(gòu)造前后,初始化前后的操作。也就是BeanPostProcessorInstantiationAwareBeanPostProcessor接口。其中InstantiationAwareBeanPostProcessor其實(shí)也是BeanPostProcessor的一個(gè)子類,BeanPostProcessor本身是在類初始化前后執(zhí)行對(duì)應(yīng)的方法,InstantiationAwareBeanPostProcessor做了一些擴(kuò)展,可以在類構(gòu)造前后執(zhí)行對(duì)應(yīng)的方法。
  3. 最后,只針對(duì)某個(gè)類級(jí)別。BeanNameAware,BeanFactoryAware,ApplicationContextAware, InitializingBean,DisposableBean等接口都是針對(duì)某個(gè)bean的構(gòu)造前后執(zhí)行方法或者初始化前后執(zhí)行方法。同樣,在xml定義init-method方法或destory-method也是具體到某個(gè)bean。我們可以把它們都?xì)w到 Bean級(jí)別的接口方法上面

Bean的生命周期大體就這樣了。有不對(duì)的地方煩請(qǐng)指出!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 轉(zhuǎn)自:http://www.cnblogs.com/zrtqsk/p/3735273.html Spring作為當(dāng)...
    鯨息_Leon閱讀 1,121評(píng)論 0 4
  • 什么是bean的生命周期? Spring是一個(gè)容器, bean是存在于容器中被管理的對(duì)象。bean的生命周期就是指...
    99793933e682閱讀 975評(píng)論 0 11
  • Spring允許Bean在生命周期中特定的時(shí)間執(zhí)行特定的任務(wù)。在bean的聲明里使用init-method和des...
    石器時(shí)代小古董閱讀 294評(píng)論 0 1
  • 作者: 一字馬胡 轉(zhuǎn)載標(biāo)志 【2017-11-03】 更新日志 Spring Bean 生命周期概述 關(guān)于Spr...
    一字馬胡閱讀 2,054評(píng)論 0 14
  • 本文參加#未完待續(xù) 就要表白#活動(dòng),本人承諾,文章內(nèi)容為原創(chuàng),且未在其他平臺(tái)發(fā)表過(guò)。 煌煌漢中郡,悠悠漢江水 鼎鼎...
    虛淵玄earth閱讀 236評(píng)論 2 0

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