Spring bean的生命週期

在傳統的Java應用中,Bean的生命週期非常簡單。 
Java的關鍵詞new用來實例化Bean(或許他是非序列化的)。這樣就夠用了。 
相反,Bean的生命週期在Spring容器中更加細緻。 
理解Spring Bean的生命週期非常重要,因爲你或許要利用Spring提供的機會來訂製Bean的創建過程。


1.容器尋找Bean的定義信息並且將其實例化。

2.受用依賴注入,Spring按照Bean定義信息配置Bean的所有屬性。

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

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

5.如果BeanPostProcessor和Bean關聯,那麼它們的postProcessBeforeInitialzation()方法將被調用。

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

7.最後,如果有BeanPsotProcessor和Bean關聯,那麼它們的postProcessAfterInitialization()方法將被調用。 
到這個時候,Bean已經可以被應用系統使用了,並且將被保留在Bean Factory中直到它不再需要。

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

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

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

Bean在Spring應用上下文的生命週期與在Bean工廠中的生命週期只有一點不同, 
唯一不同的是,如果Bean實現了ApplicationContextAwre接口,setApplicationContext()方法被調用。

只有singleton行爲的bean接受容器管理生命週期。 
non-singleton行爲的bean,Spring容器僅僅是new的替代,容器只負責創建。


對於singleton bean,Spring容器知道bean何時實例化結束,何時銷燬, 
Spring可以管理實例化結束之後,和銷燬之前的行爲,管理bean的生命週期行爲主要未如下兩個時機: 
Bean全部依賴注入之後 
Bean即將銷燬之前

1)依賴關係注入後的行爲實現: 
有兩種方法:A.編寫init方法  B.實現InitializingBean接口 
afterPropertiesSet和init同時出現,前者先於後者執行,使用init方法,需要對配置文件加入init-method屬性

2)bean銷燬之前的行爲 
有兩種方法:A.編寫close方法  B.實現DisposableBean接口 
destroy和close同時出現,前者先於後者執行,使用close方法,需要對配置文件加入destroy-method屬性

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