spring學(xué)習(xí)-bean的生命周期

spring的兩個核心:BeanFactory(心臟肉微,本身使用)與ApplicationContext(身軀中鼠,面向spring框架開發(fā)者)

一范抓、BeanFactory中的Bean的生命周期

? 首先看一下BeanFactory的體系結(jié)構(gòu)

對其中的幾個重要接口進(jìn)行簡單介紹

BeanFactory:主要是從容器中獲取bean類银锻,通過getBean(String beanName)

ListableBeanFactory:訪問容器中Bean的基本基本信息的若干方法,如bean的數(shù)量滚躯、bean的類型、bean的注解等

ConfigurableBeanFactory:這是一個重要的接口嘿歌,增強(qiáng)了Ioc容器的可定制性掸掏。定義了設(shè)置類裝載器、屬性編輯器宙帝、容器初始化后置處理器等方法丧凤。

AutowireCapableBeanFactory:定義了將容器中的Bean按某種規(guī)則(名稱、類型等)進(jìn)行自動裝配的方法步脓。

SingletonBeanRegistry:定義了允許在運(yùn)行期向容器注冊單實(shí)例Bean愿待、獲取注冊bean數(shù)量等方法。

BeanDefinitionRegistry:Spring配置文件中每一個<bean>節(jié)點(diǎn)元素在Spring容器里都通過一個BeanDefinition對象表示沪编,它描述了Bean的配置信息呼盆。此接口提供了向容器中手動注冊BeanDefinition對象的方法。

其次蚁廓,看一下通過 ? ?XmlBeanDefinitionReader和DefaultListableBeanFactory實(shí)現(xiàn)啟動Spring IOC容器访圃,看一下XmlBeanDefinitionReader的類繼承關(guān)系

具體實(shí)現(xiàn):

最后,bean的生命周期流程如下圖


具體過程如下:

1.調(diào)用者通過getBean()方法向spring容器請求一個Bean

2.若容器中注冊了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口相嵌,則在實(shí)例化Bean之前腿时,將調(diào)用接口的postProcessBeforeInstantiation()方法况脆。

3.根據(jù)容器的配置情況調(diào)用Bean構(gòu)造方法或工廠方法實(shí)例化Bean.

4.若容器注冊了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在實(shí)例化Bean之后批糟,調(diào)用postProcessBeforeInstantiation()方法對已經(jīng)實(shí)例化的Bean進(jìn)行“美化”格了。

5.若bean配置了屬性信息,在bean設(shè)置每個屬性之前先調(diào)用InstantiationAwareBeanPostProcessor的postProcessPropertyValues()方法徽鼎。

6.調(diào)用Bean的屬性設(shè)置方法設(shè)置屬性值盛末。

7.若Bean實(shí)現(xiàn)了org.springframework.beans.factory.BeanNameAware接口,將調(diào)用setBeanName()將配置文件中該Bean對應(yīng)的名稱設(shè)置到Bean中否淤。

8.若Bean實(shí)現(xiàn)了org.springframework.beans.factory.BeanFactoryAware,將調(diào)用setBeanFactory將BeanFactory容器實(shí)例設(shè)置到Bean中悄但。

9.若Bean裝配了org.springframework.beans.factory.config.BeanPostProcessor后處理器,則將調(diào)用postProcessBeforInstantiation()方法對Bean進(jìn)行加工處理石抡。

10.若Bean實(shí)現(xiàn)了InitializingBean接口檐嚣,則調(diào)用afterPropertiesSet()接口方法。

11.若<bean>屬性中定義了init-method啰扛,則執(zhí)行這個方法嚎京。

12.容器在此調(diào)用BeanPostProcessor的postProcessAfterInstantiation()方法再次對Bean進(jìn)行加工處理的機(jī)會。

13.若<bean>中配置了scope屬性隐解,若為prototype鞍帝,bean的后續(xù)生命周期轉(zhuǎn)給調(diào)用者;若為singleton厢漩,則將Bea放入spring IOC容器的緩存池中膜眠,并將bean應(yīng)用返回給調(diào)用者岩臣,spring繼續(xù)對這些Bean進(jìn)行后續(xù)的生命管理溜嗜。

14.當(dāng)容器銷毀后,將觸發(fā)spring對Bean后續(xù)生命周期的管理工作架谎。若Bean實(shí)現(xiàn)了DisposableBean接口炸宵,將調(diào)用destroy()方法,可以在此編寫釋放資源谷扣、記錄日志等等操作土全。

15.若<bean>設(shè)置了destroy-method指定了銷毀的方法,那么spring將執(zhí)行這個方法会涎,完成Bean資源釋放等操作裹匙。

bean的完整的生命周期調(diào)用的方法可以分為:

Bean的自身方法:如調(diào)用Bean的構(gòu)造函數(shù)實(shí)例化Bean、設(shè)置屬性末秃、init-method概页、destroy-method。

Bean級生命周期接口方法:如BeanNameAware练慕、BeanFactoryAware惰匙、InitializingBean和DisposableBean技掏,這些接口方法都是Bean類直接實(shí)現(xiàn)。

容器級生命周期接口方法:如2/4/9/12步驟中的InstantiationAwreBeanPostProcessor和BeanPostProcessor這兩個接口實(shí)現(xiàn)一般稱它們的實(shí)現(xiàn)類為“后處理器”项鬼。后處理器接口一般不有bean本身實(shí)現(xiàn)哑梳,獨(dú)立于bean,實(shí)現(xiàn)類已容器附件裝置的形式注冊到spring容器中绘盟,并通過接口反射為spring容器掃描識別鸠真。

工廠后處理器接口方法:包括AspectJWeavingEnabler、CustomAutowireConfigurer等方法龄毡。工廠后處理器也是容器級的弧哎,在應(yīng)用上下文裝配配置文件后立即調(diào)用。

二稚虎、ApplicationContext中的Bean的生命周期

流程如下:

bean的生命周期在ApplicationContext中與在BeanFactory基本一下撤嫩,只是多了圖中步驟1和10.

兩者的區(qū)別:

ApplicationContext利用java的反射機(jī)制自動識別出配置文件中定義的BeanPostProcessor、InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor蠢终,并自動將它們注冊到應(yīng)用上下文中序攘。

BeanFacotry:需要在代碼中手動調(diào)用addBeanPostProcessor()方法進(jìn)行注冊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寻拂,一起剝皮案震驚了整個濱河市程奠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祭钉,老刑警劉巖瞄沙,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異慌核,居然都是意外死亡距境,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門垮卓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垫桂,“玉大人,你說我怎么就攤上這事粟按∥芴玻” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵灭将,是天一觀的道長疼鸟。 經(jīng)常有香客問我,道長庙曙,這世上最難降的妖魔是什么空镜? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上姑裂,老公的妹妹穿的比我還像新娘馋袜。我一直安慰自己,他們只是感情好舶斧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布欣鳖。 她就那樣靜靜地躺著,像睡著了一般茴厉。 火紅的嫁衣襯著肌膚如雪泽台。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天矾缓,我揣著相機(jī)與錄音怀酷,去河邊找鬼。 笑死嗜闻,一個胖子當(dāng)著我的面吹牛蜕依,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琉雳,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼样眠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翠肘?” 一聲冷哼從身側(cè)響起檐束,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎束倍,沒想到半個月后被丧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绪妹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年甥桂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喂急。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡格嘁,死狀恐怖笛求,靈堂內(nèi)的尸體忽然破棺而出廊移,到底是詐尸還是另有隱情,我是刑警寧澤探入,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布狡孔,位于F島的核電站,受9級特大地震影響蜂嗽,放射性物質(zhì)發(fā)生泄漏苗膝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一植旧、第九天 我趴在偏房一處隱蔽的房頂上張望辱揭。 院中可真熱鬧离唐,春花似錦、人聲如沸问窃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽域庇。三九已至嵌戈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間听皿,已是汗流浹背熟呛。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尉姨,地道東北人庵朝。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像又厉,于是被迫代替她去往敵國和親偿短。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

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