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

再來看看BeanPostProcessor類,在BeanFactoryPostProcessor 的postProcessBeanFactory被執(zhí)行后,實(shí)現(xiàn)BeanPostProcessor接口的對(duì)應(yīng)類就會(huì)被構(gòu)造了。我們?cè)賮砜纯催@個(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>方法來完成初始化璃岳。所以postProcessBeforeInitialization和postProcessAfterInitialization方法是在這兩個(gè)執(zhí)行前后執(zhí)行的。
BeanPostProcessor的兩個(gè)方法對(duì)所有bean都會(huì)起作用,也就是說,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)系作者
  • 序言:七十年代末梗顺,一起剝皮案震驚了整個(gè)濱河市泡孩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寺谤,老刑警劉巖仑鸥,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異矗漾,居然都是意外死亡锈候,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門敞贡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泵琳,“玉大人,你說我怎么就攤上這事誊役』窳校” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵蛔垢,是天一觀的道長(zhǎng)击孩。 經(jīng)常有香客問我,道長(zhǎng)鹏漆,這世上最難降的妖魔是什么巩梢? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮艺玲,結(jié)果婚禮上括蝠,老公的妹妹穿的比我還像新娘。我一直安慰自己饭聚,他們只是感情好忌警,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秒梳,像睡著了一般法绵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酪碘,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天朋譬,我揣著相機(jī)與錄音,去河邊找鬼兴垦。 笑死徙赢,一個(gè)胖子當(dāng)著我的面吹牛庭呜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播犀忱,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼募谎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了阴汇?” 一聲冷哼從身側(cè)響起数冬,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搀庶,沒想到半個(gè)月后拐纱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哥倔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年秸架,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咆蒿。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡东抹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沃测,到底是詐尸還是另有隱情缭黔,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布蒂破,位于F島的核電站馏谨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏附迷。R本人自食惡果不足惜惧互,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喇伯。 院中可真熱鬧喊儡,春花似錦、人聲如沸艘刚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攀甚。三九已至,卻和暖如春岗喉,著一層夾襖步出監(jiān)牢的瞬間秋度,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工钱床, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荚斯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像事期,于是被迫代替她去往敵國(guó)和親滥壕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

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