Spring Bean 生命週期


任何一個事物都有自己的生命週期,生命的開始、生命中、生命結束。大家最熟悉的應該是servlet 的生命週期吧。和 servlet 一樣 spring bean 也有自己的生命週期。本文我就向大家講述 spring bean 的生命週期,這個對理解 spring 框架有非常好的作用。

大家應該知道spring 中有幾種供 springbean 生存的容器: BeanFactory 、 ApplicationContext 、webApplicationContext 。由於 ApplicationContext 和 webApplicationContext 基本一樣。所有這裏就只介紹BeanFactory 和 ApplicationContext 。

理解springBean 的生命週期主要通過兩個層面來理解。其一是 Bean 的作用範圍,其一是實例化 Bean 時所經歷的一系列階段。

一、 BeanFactory

下圖描述了BeanFactory 中 bean 生命週期的完整過程

 

 

1. 當調用者通過 getBean( name )向 容器尋找Bean 時,如果容器註冊了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在實例 bean 之前,將調用該接口的 postProcessBeforeInstantiation ()方法,

2. 根據配置情況調用 Bean構造函數或工廠方法實例化 bean  

 

3. 如果容器註冊了 org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在實例 bean 之後,調用該接口的 postProcessAfterInstantiation ()方法,可以在這裏對已經實例化的對象進行一些裝飾。

4. 受用依賴注入,Spring 按照 Bean 定義信息配置 Bean 的所有屬性 ,在設置每個屬性之前將調用InstantiationAwareBeanPostProcess接口的 postProcessPropertyValues ()方法 。 

 

5 .如果 Bean 實現了 BeanNameAware 接口,工廠調用 Bean 的 setBeanName() 方法傳遞 Bean 的 ID 。 

 

6 .如果 Bean 實現了 BeanFactoryAware 接口,工廠調用 setBeanFactory() 方法傳入工廠自身。 

 

7 .如果 BeanPostProcessor 和 Bean 關聯,那麼 將調用該接口 postProcessBeforeInitialzation() 方法  bean進行加工操作,這個非常重要, spring 的 AOP 就是用它實現的。  

 

8. 如果bean 實現了 InitializingBean 接口,將調用 afterPropertiesSet ()方法

 

9 如果Bean 指定了 init-method 方法,它將被調用。 

 

10 如果有BeanPsotProcessor 和 Bean 關聯,那麼它們的 postProcessAfterInitialization() 方法將被調用。 到這個時候, Bean 已經可以被應用系統使用了  

 

11. 如果在<bean> 中指定了該 bean 的作用範圍爲 scope="prototype", 將 bean 的調用者,調用者管理該 bean 的生命週期, spring 不在管理該 bean 。

 

12. 如果在<bean> 中指定了該 bean 的作用範圍爲 scope="singleton", 則將該 bean 放入 springIOC 的緩存池中,將觸發 spring 對該 bean 的生命週期管理。

 

13. 有兩種方法可以把它從Bean Factory 中刪除掉   

1.如果 Bean 實現了 DisposableBean 接口, destory() 方法被調用。 

 

2.如果指定了訂製的銷燬方法,就調用這個方法。 

 

 

 

總結:

Bean的完整生命週期從 spring 容器開始實例化 bean 開始,到銷燬。可以從三點來理解

1、 bean自身的方法:包括構造方法、 set 方法、 init-method 指定的方法、 destroy-method 指定的方法

2、 Bean級生命週期接口方法:如 BeanNameAware  BeanFactoryAware 等這些接口方法由 bean類實現。

3、 容器級生命週期接口方法:上圖中帶星的。有InstantiationAwareBeanPostProcessor 、 BeanPostProcessor 等。一般稱爲後處理 器。他們一般不由bean 本身實現,獨立存在,註冊到 spring 容器中。 Spring 通過接口反射預先知道,當 spring 容器創建任何 bean 時,這些後處理器都會發生作用。所以他們是全局的,用戶可以通過編碼對只感興趣的 bean 進行處理。

 

 

Bean級生命週期接口和容器級生命週期接口是個性和共性辯證統一的思想,前者解決 bean 的個性化處理問題,而後者解決容器中某些 bean 共性化處理問題。

 

 

二、 ApplicationContext

下圖描述了ApplicationContext 的生命週期

 

 

通過上圖很容易發現其實應該上下文和BeanFactory 只是多了一個接口, 如果Bean 實現了ApplicationContextAwre 接口, setApplicationContext() 方法被調用。

還有如果配置文件中生明瞭工廠後處理器接口 BeanFactoryPostProcessor的實現類,則應用上下文在裝配配置文件之後初始化 bean 之前將調用該接口對配置信息進行加工。

還有應該上下文的這些後處理器只要和普通的bean 一樣配置在 spring 配置文件中就行了,不需要事先聲明。

 

三、 總結  

 

Spring爲 bean 提供了細緻周全的生命週期過程,通過實現特定的接口或通過《bean 》屬性設置,都可以對 bean 的生命週期過程施加影響。我們可以隨意的配置bean 的屬性,使用非常靈活。但筆者在這裏建議大家不要過多的使用 bean 實現接口,因爲這樣會使你的代碼和 spring 聚合比較緊密。可以考慮使用後處理 bean ,來實現一些特殊的功能,並且非常的方便。


轉載自:http://997004049-qq-com.iteye.com/blog/1729793

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