上篇用到乙個列子
找到它的建構函式
呼叫的是上面的這個
裡面又呼叫另乙個建構函式
看到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,所有的功能擴充套件和對其他開源框架的支援都是基 於這兩點來做的,因...