spring bean 生命週期,作用域,加載過程

spring bean 生命週期:

一個類從創建到銷燬,主要經過了十個過程,實例化 織入 aware 設置屬性 實例化完成,生命週期開始 lifecycle start 調用業務

lifecycle stop 生命週期結束 ,進行 銷燬 destroy。

一個類什麼時候銷燬,如果是單例的 singleton 由容器管理,容器關閉的時候會銷燬,或者調用了destroy時會銷燬。如果是prototype 原生的類,則由客戶端來管理,當不引用的時候,jvm不可到達,然後由垃圾回收進行銷燬。

----------------------------------------------------------------------------

  1、實例化一個Bean--也就是我們常說的new;

    2、按照Spring上下文對實例化的Bean進行配置(屬性注入)--也就是IOC注入;

    3、如果這個Bean已經實現了BeanNameAware接口,會調用它實現的setBeanName(String)方法,此處傳遞的就是Spring配置文件中Bean的id值

    4、如果這個Bean已經實現了BeanFactoryAware接口,會調用它實現的setBeanFactory(setBeanFactory(BeanFactory)傳遞的是Spring工廠自身(可以用這個方式來獲取其它Bean,只需在Spring配置文件中配置一個普通的Bean就可以);

    5、如果這個Bean已經實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文(同樣這個方式也可以實現步驟4的內容,但比4更好,因爲ApplicationContext是BeanFactory的子接口,有更多的實現方法);

    6、如果這個Bean關聯了BeanPostProcessor接口,將會調用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經常被用作是Bean內容的更改,並且由於這個是在Bean初始化結束時調用那個的方法,也可以被應用於內存或緩存技術;

    7、如果Bean在Spring配置文件中配置了init-method屬性會自動調用其配置的初始化方法。

    8、如果這個Bean關聯了BeanPostProcessor接口,將會調用postProcessAfterInitialization(Object obj, String s)方法、;

    注:以上工作完成以後就可以應用這個Bean了,那這個Bean是一個Singleton的,所以一般情況下我們調用同一個id的Bean會是在內容地址相同的實例,當然在Spring配置文件中也可以配置非Singleton。

    9、當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean這個接口,會調用那個其實現的destroy()方法;

    10、最後,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷燬方法。

----------------------------------------------------------------------------------------

spring bean 作用域 :

 Singleton 在Spring IOC 容器僅存在一個Bean實例,Bean以單例方式存在,這個是默認值。
prototype 每次從容器調用bean時,都會返回一個新的實例,也就是每次調用getBean()時都會實例化一個新的bean。
request 每次HTTP請求都會創建一個新的Bean,該作用於僅適用於web環境
session 每個HTTP Session共享一個Bean,不同的Session使用不同的Bean,同樣只適用於web環境。
Global Session 一般作用於Portlet應用環境,只作用於Web環境。
五種作用域中,其中request、session、global session三種作用域僅適用於web環境。

----------------------------------------------------------------------------------------

spring bean 加載過程:

getBean  然後類的信息,進行遞歸反射 獲得一個 bean ,就加載成功了,  主要想了解spring怎麼處理這些類的依賴關係,閉環依賴等等。

循環依賴

循環依賴根據注入的時機分成兩種類型:

  • 構造器循環依賴。依賴的對象是通過構造器傳入的,發生在實例化 Bean 的時候。
  • 設值循環依賴。依賴的對象是通過 setter 方法傳入的,對象已經實例化,發生屬性填充和依賴注入的時候。

如果是構造器循環依賴,本質上是無法解決的。比如我們準調用 A 的構造器,發現依賴 B,於是去調用 B 的構造器進行實例化,發現又依賴 C,於是調用 C 的構造器去初始化,結果依賴 A,整個形成一個死結,導致 A 無法創建。

如果是設值循環依賴,Spring 框架只支持單例下的設值循環依賴。Spring 通過對還在創建過程中的單例,緩存並提前暴露該單例,使得其他實例可以引用該依賴。



作者:Oblee
鏈接:https://www.jianshu.com/p/9ea61d204559
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發佈了1 篇原創文章 · 獲贊 0 · 訪問量 9281
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章