Spring——Bean生命周期

概念:Bean生命周期歸IOC容器管理,IOC容器有兩層,Applicationcontext和Beanfactory坠七,前者面向開發(fā)者,提供了諸多豐富的api善已,后者面向底層灼捂,前者的實(shí)現(xiàn)是基于后者的。
一换团、各種接口方法分類
Bean的完整生命周期經(jīng)歷了各種方法調(diào)用悉稠,這些方法可以劃分為以下幾類:
1、Bean自身的方法 ∷野:  這個(gè)包括了Bean本身調(diào)用的方法和通過配置文件中<bean>的init-method和destroy-method指定的方法
2的猛、Bean級(jí)生命周期接口方法  :  這個(gè)包括了BeanNameAware想虎、BeanFactoryAware卦尊、InitializingBean和DiposableBean這些接口的方法
3、容器級(jí)生命周期接口方法 ∩喑:  這個(gè)包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 這兩個(gè)接口實(shí)現(xiàn)岂却,一般稱它們的實(shí)現(xiàn)類為“后處理器”。
4裙椭、工廠后處理器接口方法 □锪ā:  這個(gè)包括了AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工廠后處理器接口的方法。工廠后處理器也是容器級(jí)的揉燃。在應(yīng)用上下文裝配配置文件之后立即調(diào)用扫尺。

二、基于BeanFactory的生命周期流轉(zhuǎn)過程:
1炊汤、首先BeanFactoryPostProcessor類正驻,是Bean工廠后處理器,是一個(gè)工廠類抢腐,用于生成容器級(jí)的BeanPostProcessor類姑曙。

2、BeanFactoryPostProcessor類的postProcessorBeanFactory方法構(gòu)造出第一個(gè)容器級(jí)的BeanPostProcessor類迈倍。

3渣磷、然后實(shí)例化了InstantiationAwareBeanPostProcessorAdapter類,該類是
InstantiationAwareBeanPostProcessor類的實(shí)現(xiàn)類

4授瘦、然后調(diào)用了InstantiationAwareBeanPostProcessor類的postProcessorBeforeInstantiation方法醋界,執(zhí)行實(shí)例化Bean之前的操作竟宋。

5、然后是執(zhí)行Bean的構(gòu)造形纺,實(shí)例化Bean丘侠,但是此時(shí)并沒有執(zhí)行指定的Bean的初始化方法(init-method),只是執(zhí)行了構(gòu)造方法逐样。

6蜗字、然后執(zhí)行InstantiationAwareBeanPostProcesser的postProcessorPropertyValue方法,即后處理器屬性賦值方法脂新,接下來就給Bean的屬性賦值挪捕,即為屬性注入,自動(dòng)執(zhí)行屬性的set方法争便,此時(shí)也沒用執(zhí)行Bean的初始化方法级零。

7、然后緊接著調(diào)用Bean級(jí)別的兩個(gè)方法BeanNameAware的setBeanName方法
和BeanFactoryAware的setBeanFactory方法滞乙。
前者為Bean賦予配置的名字奏纪,可能是xml中的id,可能是注解中指定的名字斩启,不一定是類本身的類名序调。
后者則提供了Bean的工廠方法,也不知道是干啥用的兔簇,Bean都已經(jīng)實(shí)例化了发绢。傳遞的是Spring工廠自身。

如果這個(gè)Bean已經(jīng)實(shí)現(xiàn)了ApplicationContextAware接口垄琐,會(huì)調(diào)用setApplicationContext(ApplicationContext)方法边酒,傳入Spring上下文(同樣這個(gè)方式也可以實(shí)現(xiàn)步驟4的內(nèi)容,但比4更好此虑,因?yàn)锳pplicationContext是BeanFactory的子接口,有更多的實(shí)現(xiàn)方法)口锭;(springApplicationContext創(chuàng)建Bean有該步驟朦前,BeanFactory創(chuàng)建Bean無該步驟)

8、然后另一個(gè)容器級(jí)別的類終于開始運(yùn)行了鹃操,也就是BeanPostProcessor類韭寸,調(diào)用了它的postProcessorBeforeInitialization方法,該方法名與之前另一個(gè)容器級(jí)類的方法同名荆隘。它的作用是在Bean調(diào)用初始化方法之前執(zhí)行寫好的操作恩伺。

9、然后調(diào)用Bean級(jí)別的InitializationBean的afterProtertiesSet方法椰拒,從名字上看是屬性注入后執(zhí)行的方法晶渠,嗯凰荚,從前面屬性注入后,執(zhí)行這個(gè)方法褒脯,名字起的是對(duì)的便瑟。。

10番川、然后才真正執(zhí)行Bean的初始化方法到涂,init-method是在xml或注解中指定的。

此時(shí)Bean算是真正初始化完成了颁督。

11践啄、然后是執(zhí)行容器級(jí)別的BeanPostProcessor的postProcessorAfterInitialization方法,即初始化后的后處理器執(zhí)行方法沉御。

11.5屿讽、此時(shí)若scope="prototype"归斤,則Bean返回給調(diào)用者驶兜,由調(diào)用者負(fù)責(zé)Bean的生命周期,spring不再管理這個(gè)Bean围详。
若此時(shí)scope="singleton"硫痰,則Bean放入SPringIoc容器緩存池中衩婚,并將Bean的引用返回給調(diào)用者,spring繼續(xù)對(duì)這些Bean進(jìn)行后續(xù)的管理效斑。

12非春、然后執(zhí)行InstantiationAwareBeanPostProcessor的postProcessorAfterInitialization方法,即實(shí)例化后的后處理器執(zhí)行方法缓屠。

兩個(gè)容器級(jí)類的前后的后處理器的方法名是相同的奇昙。不同的是層次不同。
一個(gè)是在Bean實(shí)例化前后執(zhí)行敌完,一個(gè)是子Bean的初始化前后執(zhí)行储耐。
實(shí)例化里面嵌套著初始化方法。

13滨溉、容器執(zhí)行成功后什湘,可以在符合一定條件后銷毀Bean,此時(shí)調(diào)用DiposibleBean的destory方法

最好調(diào)用xml或注解中指定的destory-method方法晦攒。

此時(shí)Bean生命周期結(jié)束闽撤。里面包含著容器級(jí)生命周期和Bean級(jí)生命周期。

——————————

在實(shí)例化前調(diào)用了容器級(jí)方法脯颜,實(shí)例化過程中調(diào)用的Bean級(jí)別方法哟旗。
容器級(jí)類的作用是全局的,對(duì)所有Bean都起作用,Bean級(jí)別的類在作用反復(fù)僅僅在當(dāng)前Bean闸餐。
實(shí)例化過程包括通過容器級(jí)方法注入屬性以及通過Bean級(jí)方法設(shè)置BeanName和BeanFactory饱亮。

然后初始化前調(diào)用了容器級(jí)方法,實(shí)例化過程中調(diào)用了afterProtertiesSet绎巨,即屬性注入后執(zhí)行的方法近尚,然后才是Bean級(jí)別自己的初始化方法。

初始化之后調(diào)用容器級(jí)的初始化后處理器场勤。
然后是容器級(jí)的實(shí)例化后處理器戈锻。
(后處理器可以注冊(cè)多個(gè),執(zhí)行順序必須實(shí)現(xiàn)Ordered接口和媳。)

最后符合條件后執(zhí)行Bean級(jí)別的銷毀方法格遭。

——————————————
探討:
1、Spring對(duì)Bean進(jìn)行了額外的控制留瞳,但是也使得Spring框架與Bean耦合在一起了拒迅,Spring一旦有改動(dòng),或者廢棄某些方法她倘,也許就需要修改大量代碼璧微。
因此盡可能的不用Spring提供的控制。其中對(duì)于InitializingBean和DisposableBean所實(shí)現(xiàn)的功能硬梁,與Bean自身提供的init-method和destory-method一樣前硫。使用自身提供的方法更有效的解耦。
2荧止、除非開發(fā)基于Spring之上的插件或子項(xiàng)目屹电,一般用不到Bean級(jí)別的四個(gè)接口及其方法。
BeanNameAware跃巡、BeanFactoryAware危号、InitializingBean和DisposableBean。
3素邪、而BeanPostProcessor則相當(dāng)于插件外莲,為Bean提供邏輯,并且無需實(shí)現(xiàn)且繼承兔朦。
——————————————
參考:
https://www.cnblogs.com/zrtqsk/p/3735273.html
https://blog.csdn.net/laiwenqiang/article/details/54693069
https://www.cnblogs.com/kenshinobiy/p/4652008.html
《精通SPring4.x——企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末偷线,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烘绽,更是在濱河造成了極大的恐慌淋昭,老刑警劉巖俐填,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件安接,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)盏檐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門歇式,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胡野,你說我怎么就攤上這事材失。” “怎么了硫豆?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵龙巨,是天一觀的道長。 經(jīng)常有香客問我熊响,道長旨别,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任汗茄,我火速辦了婚禮秸弛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘洪碳。我一直安慰自己递览,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布瞳腌。 她就那樣靜靜地躺著绞铃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纯趋。 梳的紋絲不亂的頭發(fā)上憎兽,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音吵冒,去河邊找鬼纯命。 笑死,一個(gè)胖子當(dāng)著我的面吹牛痹栖,可吹牛的內(nèi)容都是我干的亿汞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼揪阿,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疗我!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起南捂,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤吴裤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后溺健,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體麦牺,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剖膳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魏颓。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吱晒,靈堂內(nèi)的尸體忽然破棺而出甸饱,到底是詐尸還是另有隱情,我是刑警寧澤仑濒,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布叹话,位于F島的核電站,受9級(jí)特大地震影響墩瞳,放射性物質(zhì)發(fā)生泄漏渣刷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一矗烛、第九天 我趴在偏房一處隱蔽的房頂上張望辅柴。 院中可真熱鬧,春花似錦瞭吃、人聲如沸碌嘀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽股冗。三九已至,卻和暖如春和蚪,著一層夾襖步出監(jiān)牢的瞬間止状,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工攒霹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怯疤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓催束,卻偏偏與公主長得像集峦,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抠刺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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