天天看點

spring之Bean的生命周期

bean的定義——bean的初始化——bean的使用——bean的銷毀

bean 是 spring 裝配的元件模型,一切實體類都可以配置成一個 bean ,進而就可以在任何其他的 bean 中使用,一個 bean 也可以不是指定的實體類,這就是抽象 bean 。

spring中bean的初始化回調有兩種方法

一種是在配置檔案中聲明init-method="init",然後在一個實體類中用init()方法來初始化

另一種是實作initializingbean接口,覆寫afterpropertiesset()方法。

第一種:

配置檔案:

beaninitdemo1類:

測試類:

運作結果:

這裡是init()方法初始化設值

原因:init()初始化方法的調用是在配置檔案的bean初始化之後執行的, 是以改變了配置檔案中對message的指派。

第二種:

編寫beaninitdemo2類,使其實作initializingbean接口

測試:

運作結果: 這裡覆寫了initializingbean接口的afterpropertiesset()方法設值

 原因相同,afterpropertiesset()方法在配置檔案的bean初始化後執行,是以改變了配置檔案中對message的指派

spring中有兩種使用bean的方法:

1, beanfactory:

beanfactory factory= new xmlbeanfactory(new classpathresource("bean.xml"));

factory.getbean("student");

beanfactory是延遲加載,如果bean的某一個屬性沒有注入,beanfacotry加載後,直至第一次使用getbean方法才會抛出異常,也就是說當使用beanfactory執行個體化對象時,配置的bean不會馬上被執行個體化。當你使用該bean時才會被執行個體化(getbean)。

2, applicationcontext:

applicationcontext ac = new classpathxmlapplicationcontext("bean.xml");

如果使用applicationcontext,則配置的bean如果是singleton不管你用還是不用,都被執行個體化。applicationcontext在初始化自身時檢驗,這樣有利于檢查所依賴屬性是否注入。applicationcontext是beanfactory的子類,除了具有beanfactory的所有功能外還提供了更完整的架構功能,例如國際化,資源通路等。是以通常情況下我們選擇使用applicationcontext。

bean的銷毀和初始化一樣,都是提供了兩個方法

一是在配置檔案中聲明destroy-method="cleanup",然後在類中寫一個cleanup()方法銷毀

二是實作disposablebean接口,覆寫destory()方法

beandestorydemo1類:

測試:

spring之Bean的生命周期

context.registershutdownhook()是為spring注冊關閉吊鈎,程式退出之前關閉spring容器,如果沒有context.registershutdownhook();将不會執行cleanup()方法。

beandestorydemo2類:

spring之Bean的生命周期

spring可以管理singleton作用域(預設的)的bean的生命周期,是以在bean初始化及銷毀之前可以做一些工作,更靈活的管理bean。