02 Spring配置檔案載入

2021-10-21 14:20:58 字數 4799 閱讀 4785

載入、解析xml檔案,形成genericbeandefinition,供後續例項化剩下的所有 bean 使用。

獲取ioc容器

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

try

catch (ioexception ex)

}

protected final void refreshbeanfactory() throws illegalstateexception 

this.beanfactory.setserializationid(getid());

}

在 createbeanfactory() 的方法中 new defaultlistablebeanfactory(),往其父類構造方法中能夠找到這樣一段**,是 abstractautowirecapablebeanfactory 的構造方法。

public abstractautowirecapablebeanfactory()
在 ioc 容器中設定的兩個屬性,在後面會使用到這兩個引數。

protected void customizebeanfactory(defaultlistablebeanfactory beanfactory) 

// 如果屬性allowcircularreferences不為空,設定給beanfactory物件相應屬性,是否允許bean之間存在迴圈依賴

if (this.allowcircularreferences != null)

}

這個方法有很多的過載方法,很容易迷,在這裡簡單說一下,loadbeandefinition 方法主要有載入 string 路徑形式的,resource 資源形式的,還有陣列型別的,但是陣列型別最終會調回單個的形式,string 路徑形式的,會封裝成 resource 資源的形式來進行載入。在此方法中會通過建立乙個 beandefinitionreader 形式的讀取器,來對資源檔案進行,將解析後的資源形成 beandefinition,供後續建立 bean 物件使用。

protected void loadbeandefinitions(defaultlistablebeanfactory beanfactory) throws bean***ception, ioexception
getconfiglocations()裡面的資料**於前面 setconfiglocations();

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

// 以string的形式獲得配置檔案的位置

string configlocations = getconfiglocations();

if (configlocations != null)

}

經過一系列的過載方法的處理,最終會呼叫 doloadbeandefinitions(inputsource, encodedresource.getresource()) 對其資源檔案進行處理,當然前面有一步涉及到將 string 型別的檔名轉換為 resource,然後進行處理

/** 轉換的核心方法,這個地方的資源解析器**於前面的構造方法 */

resource resources = ((resourcepatternresolver) resourceloader).getresources(location);

int count = loadbeandefinitions(resources);

異常資訊給去掉了

protected int doloadbeandefinitions(inputsource inputsource, resource resource)

throws beandefinitionstoreexception

return count;}}

具體的解析,註冊邏輯,doloaddocument 主要將 xml 物件解析封裝為 document 物件,這裡主要說明 beandefinition 具體的解析邏輯。此處還涉及到後續自定義標籤解析的一部分工作,在 createreadercontext(resource)方法中會建立 defaultnamespacehandlerresolver,此方法會在後續的時候載入 meta-inf/spring.handlers 中的 uri 和解析器的乙個對應關係。

public int registerbeandefinitions(document doc, resource resource) throws beandefinitionstoreexception
呼叫的是預設的 defaultbeandefinitiondocumentreader#registerbeandefinition

具體的註冊解析邏輯

protected void doregisterbeandefinitions(element root) 

return;}}

}/** 處理 xml 之前,可以對其進行擴充套件 */

preprocessxml(root);

/** 解析 xml 形成 beandefinition */

parsebeandefinitions(root, this.delegate);

/** 處理 xml 之後,可以對其進行擴充套件 */

postprocessxml(root);

this.delegate = parent;

}

裡面包含預設的 bean 標籤的解析和其餘自定義的標籤的處理,這裡暫時不對自定義標籤的解析其進行具體的解析,在隨後的一篇文章中說明。

protected void parsebeandefinitions(element root, beandefinitionparserdelegate delegate) 

else }}

}else

}

解析預設的標籤,包含 import,alias、beans、bean等標籤的解析,注意: beans標籤的解析會是乙個遞迴的過程,又會返回去呼叫 doregisterbeandefinitions(ele) 方法。

private void parsedefaultelement(element ele, beandefinitionparserdelegate delegate) 

else if (delegate.nodenameequals(ele, alias_element))

else if (delegate.nodenameequals(ele, bean_element))

else if (delegate.nodenameequals(ele, nested_beans_element))

}

處理 beandefinition,主要是用 beandefinitionparserdelegate 策略對其進行解析,解析之後形成 beandefinitionholder。

protected void processbeandefinition(element ele, beandefinitionparserdelegate delegate) 

catch (beandefinitionstoreexception ex)

// send registration event.

// 在beandefinition向ioc容器註冊完成之後,傳送訊息

getreadercontext().firecomponentregistered(new beancomponentdefinition(bdholder));}}

將得到的 beandefinition 註冊到 ioc 中。

public static void registerbeandefinition(

beandefinitionholder definitionholder, beandefinitionregistry registry)

throws beandefinitionstoreexception }}

方法存在於 defaultlistablebeanfactory 類中,主要存放在兩個地方,乙個為 beandefinitionmap,beanname 為 key,beandefinition 為 value,beandefinitionnames 中存放所有的 bean 名稱,在後續例項化所有剩下的 bean 中會使用,注意:beandefinitionnames 中存放的名稱是有順序的。

至此 解析形成的 xml 已經註冊到 ioc 中。

spring配置檔案載入

spring配置檔案的裝載在web.xml中配置 此引數用於後面的spring context loader contextconfiglocation org.springframework.web.context.contextloaderlistener 說明 contextconfigloc...

spring載入配置檔案

在spring中載入配置檔案的方式 configuration propertysource import datasourceconfig.class bean public static propertysourcesplaceholderconfigurer propertysourcespl...

Spring配置檔案載入外部配置檔案

有時,應用程式可能需要從不同的位置 例如 檔案系統 classpath或者url 讀取外部資源 例如 文字檔案 xml檔案 屬性檔案或或者影象檔案 通常,為了從不同位置載入資源,需要和不同的api打交道。spring的資源載入器提供了乙個統一的getresource 方法,使用這個方法可以通過資源路...