33 深入解析spring技術 3

2021-09-12 05:20:54 字數 3194 閱讀 9766

通過beandefinitionparserdelegate完成對資源檔案的解析與載入,資源檔案在ioc容器中建立了相應資料,但是這些資料還不能直接供ioc使用,需要在defaultlistablebeanfactory中進行註冊;在31章圖2中,這個類實現了beandefinitionregistry介面,這個介面完成beandefinition向beanfactory中註冊;

在上章最後執行:

beandefinitionreaderutils.registerbeandefinition( beandefinitionholder definitionholder, beandefinitionregistry registry)throws beandefinitionstoreexception
通過上面的方法完成beandefinition的註冊,完成了refresh()的obtainfreshbeanfactory()方法

,同時,defaultlistablebeanfactory中註冊了整個bean的配置資訊,所以這些配置資訊就可以供ioc使用;

$3、依賴注入

在beanfactory這個基本ioc容器中,定義了4個獲取bean的方法getbean();下面來解析getbean的實現:

defaultlistablebeanfactory的基類abstractbeanfactory.getbean()

@override

public object getbean(string name) throws bean***ception

@override

public t getbean(string name, classrequiredtype) throws bean***ception

@override

public object getbean(string name, object... args) throws bean***ception

public t getbean(string name, classrequiredtype, object... args) throws bean***ception

createbeaninstance會根據傳遞進來class=「」的引數建立乙個例項,populatebean將要注入的屬性值給予賦值;

到這裡 有必要對容器的建立、資源的定位、載入、註冊(注入)、容器的銷毀 梳理一下:

super(null);

setconfiglocations(configlocations);   //將檔案位址賦值給configlocations這個屬性

refresh();

preparerefresh();   //準備重新整理,

configurablelistablebeanfactory beanfactory = obtainfreshbeanfactory();  

//獲得全新的beanfactory,呼叫loadbeandefinitions()載入資源

(關鍵方法:

refreshbeanfactory();

loadbeandefinitions(beanfactory);

)

protected configurablelistablebeanfactory obtainfreshbeanfactory() 

return beanfactory;

}

@override

protected final void refreshbeanfactory() throws bean***ception

try

} catch (ioexception ex)

}@override

protected void cancelrefresh(bean***ception ex)

super.cancelrefresh(ex);

}@override

protected final void closebeanfactory()

}protected final boolean hasbeanfactory()

}@override

public final configurablelistablebeanfactory getbeanfactory()

return this.beanfactory; }}

@override

protected void assertbeanfactoryactive()

protected defaultlistablebeanfactory createbeanfactory()

protected void customizebeanfactory(defaultlistablebeanfactory beanfactory)

if (this.allowcircularreferences != null)

}protected abstract void loadbeandefinitions(defaultlistablebeanfactory beanfactory)

throws bean***ception, ioexception;}

preparebeanfactory(beanfactory);  //bean是configurablelistablebeanfactory的例項;

beanfactory.setbeanclassloader(getclassloader());
//配置標準容器特性,如類載入器,後置處理器:post-processors  ,等

postprocessbeanfactory(beanfactory); 

invokebeanfactorypostprocessors(beanfactory);

//將使用上一步新增的後置處理器。

registerbeanpostprocessors(beanfactory);     //註冊  後置處理器

protected void registerbeanpostprocessors(configurablelistablebeanfactory beanfactory) 

找了老半天都沒找到postprocessorregistrationdelegate在**宣告的。

重點是loadbeandefinitions(beanfactory)方法;結合第$2章學習;

33 深入解析spring技術 3

通過beandefinitionparserdelegate完成對資源檔案的解析與載入,資源檔案在ioc容器中建立了相應資料,但是這些資料還不能直接供ioc使用,需要在defaultlistablebeanfactory中進行註冊 在31章圖2中,這個類實現了beandefinitionregist...

《hadoop技術內幕 深入解析YARN架構設計》

hadoop技術內幕 深入解析yarn架構設計 本書是 hadoop技術內幕 系列的第3本書,前面兩本分別對common hdfs和mapreduce進行了深入分析和講解,贏得了極好的口碑,hadoop領域幾乎人手一冊,本書則對yarn展開了深入的 是首部關於yarn的專著。仍然由資深hadoop技...

現代前端技術解析 3

手動觸發指令繫結是比較直接的實現方式,主要思路是通過在資料物件上定義get 方法和set 方法,呼叫時手動觸發get 或set 函式來獲取 修改資料,改變資料後會主動觸發get 和set 函式中view層的重新渲染功能。我們來看乙個栗子 q value value type text id inpu...