Spring原始碼分析之IOC2

2021-08-27 10:11:37 字數 3843 閱讀 1567

上篇用到乙個列子

找到它的建構函式

呼叫的是上面的這個

裡面又呼叫另乙個建構函式

看到setconfiglocations(configlocations);這個方法,在跟進去咯

public void setconfiglocations(string locations) 

}else

}

這裡面的關鍵點是

this.configlocations = new string[locations.length];

for (int i = 0; i < locations.length; i++)

這裡面有個屬性configlocations其定義如下

private string configlocations;
,就是個陣列來存放路徑的,

在上面關鍵**第一行初始化,然後for語句段就是解析路徑的。resolvepath方法就不跟進咯,ok,在回到上上面的建構函式裡,解釋了setconfiglocations方法,在往下走咯。就來到

if (refresh) 

}

由於傳進來的refresh引數是true,所以refresh()方法就會執行咯。好吧,上refresh這牛x的方法

這方法的東西好豐富哦,就各點來擊破咯

first 這 synchronized (this.startupshutdownmonitor) 都懂得啥下面first的方法是preparerefresh();這方法可以忽略咯,就是setting its startup date,

second 就是configurablelistablebeanfactory beanfactory = obtainfreshbeanfactory();

原始碼如下

protected configurablelistablebeanfactory obtainfreshbeanfactory() 

return beanfactory;

}

這裡面又有別的方法呼叫咯,第乙個方法實現

這裡面又呼叫了createbeanfactory(),看方法就明白意思了啥,就是建立beanfactory.

protected defaultlistablebeanfactory createbeanfactory() 

protected void loadbeandefinitions(defaultlistablebeanfactory beanfactory) throws bean***ception, ioexception

這裡面建立了乙個xmlbeandefinitionreader 物件,這玩意就是來讀取基於xml bean定義的

。而beandefinitionreader.setresourceloader(this);這句咯是為reader配置resourceloader,因為defaultresourceloader是父類,所以this可以直接被使用。initbeandefinitionreader(beandefinitionreader);是初始化,而loadbeandefinitions(beandefinitionreader);類容多了

protected void loadbeandefinitions(xmlbeandefinitionreader reader) throws bean***ception, ioexception

string configlocations = getconfiglocations();

if (configlocations != null)

}

這裡面的有兩種方式載入bean咯,乙個是resouce,乙個是string,來看下reader.loadbeandefinitions(configresources);的實現

public int loadbeandefinitions(resource... resources) throws beandefinitionstoreexception 

return counter;

}

這裡面又呼叫了 loadbeandefinitions()這方式的實現是在xmlbeandefinitionreader中,

public int loadbeandefinitions(encodedresource encodedresource) throws beandefinitionstoreexception 

setcurrentresources = this.resourcescurrentlybeingloaded.get();

if (currentresources == null)

if (!currentresources.add(encodedresource))

try

return doloadbeandefinitions(inputsource, encodedresource.getresource());

}finally

}catch (ioexception ex)

finally

}}

這**的主要意思是,的到xml檔案,並得到io的inputsource.在返回時有句doloadbeandefinitions(inputsource, encodedresource.getresource());這發放的原始碼

protected int doloadbeandefinitions(inputsource inputsource, resource resource)

throws beandefinitionstoreexception

catch (beandefinitionstoreexception ex)

catch (saxparseexception ex)

catch (saxexception ex)

catch (parserconfigurationexception ex)

catch (ioexception ex)

catch (throwable ex)

}

這方法就是載入bean定義在制定的xml檔案。主要**是

document doc = this.documentloader.loaddocument(

inputsource, getentityresolver(), this.errorhandler, validationmode, isnamespaceaware());

documentloader的例項 private documentloader documentloader = new defaultdocumentloader();它主要是取得xml檔案document物件。這裡就不在詳述了,時間有限咯。

在取得document物件後,就要開始註冊咯registerbeandefinitions(doc, resource);就由這方法搞定咯

public int registerbeandefinitions(document doc, resource resource) throws beandefinitionstoreexception 

Spring原始碼 IOC(一)

它是spring中bean容器的頂級介面。裡面有獲取bean,判斷是否包含bean,是否單例,獲取別名等基本方法 listablebeanfactory 根據條件獲取bean的配置清單。如string getbeandefinitionnames 返回bean在工廠中定義的名稱。bean在工廠中定義...

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

Spring原始碼學習(一) IoC

一直想抽空把spring原始碼拿來讀讀,但真正去做這件事的時候發現不簡單,spring發展這麼多年,它的規模已不是乙個一般的開源框 架所能比的,它的主要架構和流程不是非常清晰,很難抓到要害,但有一點可以肯定,它的根基是ioc和aop,所有的功能擴充套件和對其他開源框架的支援都是基 於這兩點來做的,因...