Spring bean 的生命周期的詳解
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屬性