天天看點

Spring Bean 生命周期

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

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

了解springBean 的生命周期主要通過兩個層面來了解。其一是 Bean 的作用範圍,其一是執行個體化 Bean 時所經曆的一系列階段。

一、 BeanFactory

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

Spring 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 的生命周期

Spring Bean 生命周期

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

還有如果配置檔案中生明了工廠後處理器接口 BeanFactoryPostProcessor的實作類,則應用上下文在裝配配置檔案之後初始化 bean 之前将調用該接口對配置資訊進行加工。

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

三、 總結  

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

繼續閱讀