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