Spring bean 載入執行順序例項解析

2022-09-27 04:00:15 字數 2377 閱讀 2055

問題**:

有乙個bean為a,乙個bean為b。想要a在容器例項化的時候的乙個屬性name賦值為b的乙個方法funb的返回值。

如果只是在a裡單純的寫著:

private b b;

private string name = b.funb();

會報錯說nullpointexception,因為這個時候b還沒被set進來,所以為null。

解決辦法為如下**,同時學習下spring中 initializingbean ,物件構造方法 , init-method 的執行順序。

public class a implements initializingbean

public a()

public void init()

@override

public string tostring()

public void afterpropertiesset() throws exception

}public class b

public b()

}spring配置檔案

www.cppcns.comtestspring.b">

測試**:

public static void main(string args)

程式輸出為:

a initialed

b initialed

a.setb initialed

afterpropertiesset

init

funb

[email protected]

從這裡看到a的name屬性在bean載入完成的時候也被成功設定為b的funb方法的返回值了,要點就是用init-method來實現。

載入順序也可以看到為:

先建構函式——>然後是b的set方法注入——>initializingbean 的afterpropertiesset方法——>init-method方法

以下內容是從書中摘錄來的,但是我發現即使摘錄一遍,對其內容的理解也會更加深入!

一、spring裝配bean的過程

1. 例項化;

2. 設定屬性值;

3. 如果實現了beannameaware介面,呼叫setbeanname設定bean的id或者name;

4. 如果實現beanfactoryaware介面,呼叫setbeanfactory 設定beanfactory;

5. 如果實現applicationcontextaware,呼叫setapplicationcontext設定applicationcontext

6. 呼叫beanpostprocessor的預先初始化方法;

7. 呼叫initializingbean的afterpropertiesset()方法;

8. 呼叫定製init-method方法;

9. 呼叫beanpostprocessor的後初始化方法;

spring容器關閉過程

1. 呼叫disposablebean的destroy();

2. 呼叫定製的destroy-method方法;

一、單一bean

裝載1. 例項化;

2. 設定屬性值;

3. 如果實現了beannameaware介面,呼叫setbeanname設定bean的id或者name;

4. 如果實現beanfactoryaware介面,呼叫setbeanfactory 設定beanfactory;

5. 如果實現applicationcontextaware,呼叫setapplicationcontext設定applicationcontext

6. 呼叫beanpostprocessor的預先初始化方法;

7. 呼叫initializingbean的afterpropertiesset()方法;

8. 呼叫定製init-method方法;

9. 呼叫beanpostprocessor的後初始化方法;

spring容器關閉

1. 呼叫disposablebean的destroy();

2. 呼叫定製的destroy-method方法;

二、多個bean的先後順序

優先載入beanpostprocessor的實現bean

按bean檔案和bean的定義順序按bean的裝載順序(即使載入多個spring檔案時存在id覆蓋)

「設定屬性值」(第2步)時,遇到ref,則在「例項化」(第1步)之後先載入ref的id對應的bean

abstractfactorybean的子類,在第6步之後,會呼叫createinstance方法,之後會呼叫getobjecttype方程式設計客棧法

bean程式設計客棧fa程式設計客棧ctoryutils類也會改變bean的載入順序

JS 的載入執行順序

近來對js在html中的載入順序有點小疑惑,遂測試分析了一把 just a test case.you are in footer.結果依次為 div標籤 before head 出現,i m in head div標籤 after head 出現,i m in body part1 div jus...

Java類載入執行順序

簡要記錄類的載入執行順序 先說結論 父類靜態 塊 變數 子類靜態 塊 變數 父類普通 變數 塊 父類構造器 子類普通 變數 塊 子類構造器 具體執行過程 程式先找到main函式,不管此時有沒有使用new進行建立物件,都會將涉及到的類 例如父類 進行類載入 發現son類有乙個父類father類 初始化...

jraiser模組載入執行簡要總結

1 在html檔案中,通過require方式來載入指定的入口檔案 2 然後通過正規表示式來匹配入口檔案中的所有require的依賴檔案 注意,此時入口檔案已載入完畢,不過,還沒執行而已。3 之後逐一通過script來新增到dom中,進行載入所有依賴的js檔案 4 等所有依賴的js檔案都載入完畢,再執...