Spring中Bean的生命周期


Spring中Bean的生命周期

同樣是《Spring 3.x企業應用開發實戰》這本書所寫的內容,今天看完以后想做一個總結。

 

首先我們大家應該知道spring 中有三種供 spring中bean 生存的容器: BeanFactory 、 ApplicationContext 、webApplicationContext 。其中ApplicationContext 和 webApplicationContext 基本一樣,webApplicationContext就是有一些web專用的東西。所有這里就只介紹BeanFactory 和 ApplicationContext 。

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

一、 BeanFactory

下圖為BeanFactory 中 bean 生命周期的完整過程(圖來自《Spring 3.x企業應用開發實戰》)

 

 以下按照順序寫一下調用的過程分別調用了哪些方法,為了方便理解,我用紅字寫了一下個人的猜測翻譯理解: 

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

實例化以前的操作

 

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

 

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

其實觀察的仔細一點,就會發現1和3是同一個InstantiationAwareBeanPostProcessor接口,只不過調用的方法一個是postProcessBeforeInstantiation()和一個是postProcessAfterInstantiation(),一個before一個after一前一后,分別在實例化bean這個操作的前后,Instantiation這個單詞就是實例化的意思。

 

4.如果Bean配置了屬性信息,在設置每個屬性之前將調用InstantiationAwareBeanPostProcess接口的 postProcessPropertyValues ()方法 。 

於是我們發現又是和1、3同一個接口,只不過換了一個方法postProcessPropertyValues,字面上就能看出和屬性相關,是設置屬性前的操作

 

5.設置屬性值

 

6.如果 Bean 實現了 org.springframework.beans.factory.BeanNameAware 接口,將調用 Bean 的 setBeanName() 方法傳遞 Bean 的 ID 。

設置完屬性,首先是BeanNameAware的setBeanName()方法,設置bean名稱。

 

7.如果 Bean 實現了  org.springframework.beans.factory.BeanFactoryAware 接口,將調用 setBeanFactory() 方法傳入工廠自身。

然后是 BeanFactoryAware的setBeanFactory() 方法,設置bean實例。

 

8.如果 BeanPostProcessor 和 Bean 關聯,那么 將調用org.springframework.beans.factory.config.BeanPostProcessor的postProcessBeforeInitialzation() 方 對 bean進行加工操作,與spring 的 AOP 有關。  

這個同樣是對bean的處理,BeanPostProcessor接口的postProcessBeforeInitialzation()方法。

 

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

InitializingBean接口的afterPropertiesSet()方法

 

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

 init-method 方法

 

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

與8相對應,又是一個前一后,一個before一個after

 

12-a.如果在<bean> 中指定了該 bean 的作用范圍為 scope="prototype", 將 bean 的調用者,調用者管理該 bean 的生命周期,spring 不在管理該 bean 。

spring不管理該bean的情況為scope="prototype",此處12為分叉,有兩種情況

 

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

spring管理該bean的情況為scope="singleton",此處12為分叉,有兩種情況

 

13-a.如果 Bean 實現了 DisposableBean 接口, afterPropertiesSet()方法()被調用。

 

14-a.直接通過destroy-method銷毀

 

14-b 這個bean自己的管理者如何銷毀,spring不管。

 

 

 

總結:

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() 方法被調用。

在上圖的7和8之間

 

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

在上圖中的1之前

 

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

而BeanFactory必須要聲明比較麻煩

 

總結:

沒啥好總結的,理解都在上面了,如有錯誤請指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM