Spring學習筆記:Spring Bean的生命周期

本文僅供學習交流使用,侵權必刪。
不作商業用途,轉載請注明出處

Spring Bean生命周期細分為以下階段:


Spring Bean生命周期

我將Bean的生命周期理解為由兩個主要過程組成:創建過程以及銷毀過程。

源碼閱讀

Bean創建過程

Bean創建過程的代碼入口在AbstractAutowireCapableBeanFactory的createBean方法。

Bean實例化過程

實例化前階段

  • 實例化前階段是在AbstractAutowireCapableBeanFactory的resolveBeforeInstantiation中執行。


    resolveBeforeInstantiation
  • 其中這里的applyBeanPostProcessorsBeforeInstantiation方法是執行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation回調方法。


    applyBeanPostProcessorsBeforeInstantiation
  • 這里需要注意的是如果InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法返回的是一個not null對象。beanFactory會直接通過applyBeanPostProcessorsAfterInitialization方法執行Bean初始化后置階段,中間的所有bean生命周期過程都會跳過。

實例化階段

  • AbstractAutowireCapableBeanFactory的doCreateBean方法中,createBeanInstance方法就是bean實例化代碼,這個方法會根據對應beanDefinition的定義使用不同的策略進行bean的實例化操作:工廠方法、構造器自動注入方法以及普通實例化方法


    doCreateBean

實例化后階段

  • doCreateBean中的populateBean方法中除了Bean的賦值操作之外,其實還包含了實例化后階段操作,以下是populateBean中具體的實例化后階段的代碼執行,這里是通過遍歷方式執行InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation回調方法


    populateBean中實例化后階段代碼段

Bean賦值階段

賦值前階段

  • Bean的賦值前階段同樣是在populateBean中完成,這里以遍歷方式執行InstantiationAwareBeanPostProcessor的postProcessProperties回調方法


    populateBean中賦值前階段代碼段

賦值階段

populateBean中的applyPropertyValues是Bean的賦值階段操作核心方法,這里是將BeanDefinition中的PropertyValue賦值給Bean實例

Bean初始化階段

AbstractAutowireCapableBeanFactory的initializeBean方法是Bean初始化階段的入口invokeAwareMethods

Aware接口回調

  • 進入到initializeBean方法后首先會看到Aware接口回調的入口


    initializeBean的Aware接口回調
  • invokeAwareMethods會依次回調BeanNameAware、BeanClassLoaderAware以及BeanFactoryAware


    invokeAwareMethods

Bean初始化前階段

  • 在執行完Aware接口回調后,就會執行applyBeanPostProcessorsBeforeInitialization進行初始化前階段的操作了


    initializeBean的初始化前階段
  • applyBeanPostProcessorsBeforeInitialization以遍歷方式執行BeanPostProcessor的postProcessBeforeInitialization回調方法。
    其中這里會調用的InitDestroyAnnotationBeanPostProcessor的postProcessBeforeInitialization方法(通過子類CommonAnnotationBeanPostProcessor調用),此方法會回調@PostConstruct標記的初始化方法


    applyBeanPostProcessorsBeforeInitialization

Bean初始化階段

  • 在執行完Bean初始化前階段操作后,就是執行invokeInitMethods進行初始化階段的操作了
invokeInitMethods
  • 在invokeInitMethods初始化階段中,如果Bean實現了InitializingBean接口,首先會先執行InitializingBean的afterPropertiesSet方法,如下圖


    InitializingBean接口方法調用
  • 然后就會執行BeanDefinition中的自定義初始化方法,如下圖


    BeanDefinition自定義方法執行

Bean初始化后階段

  • 執行完invokeInitMethods后,就會調用applyBeanPostProcessorsAfterInitialization,執行Bean初始化后階段操作,如下圖


    image.png
  • 在applyBeanPostProcessorsAfterInitialization中以遍歷方式回調BeanPostProcessor的postProcessAfterInitialization方法


    applyBeanPostProcessorsAfterInitialization

Bean初始化完成階段

  • Bean初始化完成階段是4.1版本才出現的,所以4.1之前的framework代碼中是沒有這個階段的操作。
  • 這里注意需要Bean類實現SmartInitializingSingleton接口的afterSingletonsInstantiated方法


    初始化完成代碼段

Bean銷毀階段

Bean的銷毀方法可以通過容器關閉的方法一步步進入到里面看到,單例Bean的銷毀過程主要在DisposableBeanAdapter類的destroy方法中執行,在DefaultSingletonBeanRegistry(AbstractBeanFactory的父類)中會有一個集合存放這這些DisposableBeanAdapter,每個Bean對應一個DisposableBeanAdapter實例

Bean銷毀前階段

  • 其中銷毀前階段是通過DisposableBeanAdapter類以遍歷方式回調DestructionAwareBeanPostProcessor的postProcessBeforeDestruction方法


    image.png
  • 其中@PreDestroy標記的銷毀方法是在這里通過InitDestroyAnnotationBeanPostProcessor(DestructionAwareBeanPostProcessor的實現類)的postProcessBeforeDestruction方法進行回調操作


    image.png

Bean銷毀階段

  • 完成了Bean的銷毀前階段操作后,在DisposableBeanAdapter的destroy方法中,會調用DisposableBean的destroy方法,如下圖:


    調用DisposableBean接口方法的代碼段
  • 緊接著又會通過invokeCustomDestroyMethod調用BeanDefinition中定義的自定義銷毀方法,如下圖


    調用自定義銷毀方法的代碼段

總結

Bean的生命周期主要分為創建過程銷毀過程。創建又分為實例化前置階段、實例化階段、實例化后置階段、賦值前置階段、賦值階段、初始化前置階段、初始化階段、初始化后置階段、初始化完成階段。銷毀又分為銷毀前置階段以及銷毀階段
Bean的生命周期設計里面,Spring開發人員留了多個擴展接口讓用戶能干預Bean創建和銷毀。但是需要注意的是開發人員要了解每個擴展接口的執行順序以及里面的一些代碼細節,才能更好地使用這些擴展接口在日常開發上。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,744評論 3 421
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,879評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,181評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,935評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,325評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,534評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,084評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,892評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,322評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,735評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,990評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,800評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,084評論 2 375

推薦閱讀更多精彩內容