天天看點

@Bean 生命周期

bean生命周期:

@Bean 生命周期

執行個體bean

1.當調用者通過getbean(beanname)向容器請求某一個bean時,如果容器注冊了org.springframework.beans.factory.config.instantiationawarebeanpostprocessor接口,在執行個體化bean之前,将調用接口的postprocessbeforeinstantiation()方法;

2.根據配置情況調用bean構造函數或工廠方法執行個體化bean;

3.如果容器注冊了instantiationawarebeanpostprocessor接口,在執行個體化bean之後,調用該接口的postprocessafterinstantiation()方法,可在這裡對已經執行個體化的對象進行一些"梳妝打扮";

4.如果bean配置了屬性資訊,容器在這一步着手将配置值設定到bean對應的屬性中,不過在設定每個屬性之前将先調用instantiationawarebeanpostprocessor接口的postprocesspropertyvalues()方法;

**

初始化和使用bean

1:beannameaware的setbeanname():

如果bean類有實作org.springframework.beans.beannameaware接口,工廠調用bean的setbeanname()方法傳遞bean的id。

2:beanfactoryaware的setbeanfactory():

如果bean類有實作org.springframework.beans.factory.beanfactoryaware接口,工廠調用setbeanfactory()方法傳入工廠自身。

3:beanpostprocessors的processbeforeinitialization()

如果有org.springframework.beans.factory.config.beanpostprocessors和bean關聯,那麼其postprocessbeforeinitialization()方法将被将被調用。

4:initializingbean的afterpropertiesset():

如果bean類已實作org.springframework.beans.factory.initializingbean接口,則執行他的afterpropertiesset()方法

5:bean定義檔案中定義init-method:

可以在bean定義檔案中使用"init-method"屬性設定方法名稱例如:

如果有以上設定的話,則執行到這個階段,就會執行initbean()方法

6:beanpostprocessors的processaafterinitialization()

如果有任何的beanpostprocessors執行個體與bean執行個體關聯,則執行beanpostprocessors執行個體的processaafterinitialization()方法

beanpostprocessor後處理器定義了兩個方法:

**       其一是postprocessbeforeinitialization()在第8步調用;其二是object postprocessafterinitialization(object bean, string beanname)方法,這個方法在此時調用,容器再次獲得對bean進行加工處理的機會;**

**       如果在中指定bean的作用範圍為scope="prototype",将bean傳回給調用者,調用者負責bean後續生命的管理,spring不再管理這個bean的生命周期。如果作用範圍設定為scope="singleton",則将bean放入到spring ioc容器的緩存池中,并将bean引用傳回給調用者,spring繼續對這些bean進行後續的生命管理;**

 銷毀bean

此時,bean已經可以被應用系統使用,并且将保留在beanfactory中知道它不在被使用。有兩種方法可以将其從beanfactory中删除掉

1:disposablebean的destroy()

在容器關閉時,如果bean類有實作org.springframework.beans.factory.disposablebean接口,則執行他的destroy()方法

2:bean定義檔案中定義destroy-method

在容器關閉時,可以在bean定義檔案中使用"destroy-method"屬性設定方法名稱,例如:

如果有以上設定的話,則進行至這個階段時,就會執行destroy()方法,如果是使用applicationcontext來生成并管理bean的話則稍有不同,使用applicationcontext來生成及管理bean執行個體的話,在執行beanfactoryaware的setbeanfactory()階段後,若bean類上有實作org.springframework.context.applicationcontextaware接口,則執行其setapplicationcontext()方法,接着才執行beanpostprocessors的processbeforeinitialization()及之後的流程。

代碼:

beans.xml

result: