spring容器可以管理singleton作用域的bean的生命週期,可以呼叫建立、初始化、銷毀等生命週期的方法。
對於prototype作用域的bean,spring容器只負責建立,建立後bean的例項就交給客戶端**來管理,spring容器不再跟蹤其生命週期。
1、檢查此bean是否有依賴的bean,如果所依賴的bean尚未例項化,則先例項化依賴的bean;
如果依賴的bean都已例項化,則呼叫此bean的構造方法或工廠方法建立此bean的例項
2、利用依賴注入注入所需依賴(給成員變數賦值)
3、如果bean實現了beannameaware介面,則呼叫setbeanname()方法傳入當前bean的name。
4、如果bean實現了beanfactoryaware介面,則呼叫setbeanfactory()傳入當前工廠例項的引用
6、如果beanpostprocessor和bean關聯,則呼叫預初始化方法postprocessbeforeinitialzation()進行加工操作,spring aop即利用此實現。
7、容器前處理(可以實現一些自定義的操作)
8、如果beanpostprocessor和bean關聯,則呼叫初始化方法postprocessafterinitialization()。此時,bean已經可以被正常使用了。
9、如果指定了作用域為singleton,則將例項放在spring ioc的快取池中,並觸發spring容器對該bean的生命週期管理,如果指定作用域為prototype,則將該bean交給呼叫者,由呼叫者管理該bean的生命週期。
10、容器後處理(銷毀bean的例項時要做的操作)
說明:以上介面中,均只有乙個方法。
並不建議讓bean實現多個介面,因為繼承多個介面會使**耦合較高。
將bean的例項放到spring容器之前做一些處理。
有3種方式可以實現容器前處理:
在spring容器銷毀bean的例項之前做一些處理。
同樣有3種方式可以實現容器後處理:
不管是容器前處理,還是容器後處理,這三種方式都可以一起使用。
一起使用時,都是先執行註解標註的方法,再執行介面中的方法,最後執行xml中指定的方法。
有的教程說 init-method <=> @postconstruct , destroy-method <=> @predestroy,
如果只使用三種中的一種,這三種的效果是一樣的,這句話是對的;
如果同時使用2種或3種,則執行有先後之分,這句話是錯的。
class="" lazy-init="true" />
預設scope="singleton",spring容器啟動時就例項化scope="singleton"的bean。
lazy-init配置是否延遲載入bean:
雖然所有都能配置lazy-init,但lazy-init屬性只對scope="singleton"的起作用。
依賴:
@component@scope(
"prototype")
public
class
b }
為避免b類在spring容器啟動時就建立例項,將其作用域設定為prototype。
主調類:
@componentpublic
class a implements
initializingbean, disposablebean
@postconstruct
public void postconstruct()
@override
public void afterpropertiesset() throws exception
public void xmlinit()
@predestroy
public void predestroy()
@override
public void destroy() throws exception
public void xmldestroy()
}
xml配置:
<?xml version="1.0" encoding="utf-8"?>xmlns:xsi=""xmlns:context=""xsi:schemalocation=" /spring-beans.xsd ">
package="com.chy.bean"/>
class="com.chy.bean.a" init-method="xmlinit" destroy-method="xmldestroy" />
測試類:
publicclass
test
}
在基於web的spring容器中,web伺服器(比如tomcat)已經提供了對應的設定,在web應用關閉時,會自動關閉spring容器。
在非web的spring容器中,需要手動呼叫close()方法關閉spring容器。
執行程式,控制台輸出如下:
正在建立b類例項...
正在執行a的建構函式...
正在執行@postconstruct註解指定的方法...
正在執行initializingbean介面中的afterpropertiesset()方法...
正在執行xml中init-method指定的方法...
正在執行@predestroy註解指定的方法...
正在執行disposablebean介面中的destroy()方法...
正在執行xml中destroy-method指定的方法...
執行過程分析:
a依賴b,b是prototype,需要時才建立例項,a是singleton,spring容器啟動時就建立例項。
(1)a所依賴的b尚未例項化,先建立b的例項
(2)建立a的例項,注入b的例項
(3)執行容器前處理(先註解,再介面,最後xml)
(4)a的作用域是singleton,將建立的a的例項放到spring容器中(如果是prototype,則不放到容器中)
(5)spring容器關閉,銷毀spring容器中所有的bean,執行容器後處理,銷毀a的例項。
Spring Bean生命週期
1.容器尋找bean的定義資訊並且將其實例化。2.受用依賴注入,spring按照bean定義資訊配置bean的所有屬性。3.如果bean實現了beannameaware介面,工廠呼叫bean的setbeanname 方法傳遞bean的id。4.如果bean實現了beanfactoryaware介面,...
spring bean生命週期
生命週期 定義,初始化,使用,銷毀 一.初始化 方法1.實現org.springframework.beans.foctory.initializingbean介面,覆蓋afterpropertiesset方法。系統會自動查詢afterpropertiesset方法,執行其中的初始化操作 方法2.配...
Springbean生命週期
springbean的完整生命週期大致如下 1 首先例項化 beanfactorypostprocessor的實現類,執行它的postprocessorbeanfactory方法 2 例項化beanpostprocessor 的實現類 3 例項化 instantiationawarebeanpost...