Spring Bean的生命週期

2021-10-05 02:34:11 字數 3102 閱讀 7310

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。

主調類:

@component

public

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" />

測試類:

public

class

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...