基於Xml 的IOC 容器 載入 bean 元素

2021-10-10 13:38:51 字數 2256 閱讀 4206

bean 配置資訊中的和元素解析在defaultbeandefinitiondocumentreader 中已經完成,對bean 配置資訊中使用最多的元素交由beandefinitionparserdelegate 來解析,其解析實現的原始碼如下:

//解析元素的入口

@nullable

public beandefinitionholder parsebeandefinitionelement(element ele)

//解析bean定義資源檔案中的元素,這個方法中主要處理元素的id,name和別名屬性

@nullable

public beandefinitionholder parsebeandefinitionelement(element ele, @nullable beandefinition containingbean)

string beanname = id;

//如果元素中沒有配置id屬性時,將別名中的第乙個值賦值給beanname

if (!stringutils.hastext(beanname) && !aliases.isempty())

} //檢查元素所配置的id或者name的唯一性,containingbean標識//元素中是否包含子元素

if (containingbean == null)

//詳細對元素中配置的bean定義進行解析的地方

abstractbeandefinition beandefinition = parsebeandefinitionelement(ele, beanname, containingbean);

if (beandefinition != null)

else

}if (logger.isdebugenabled())

}catch (exception ex)

} string aliasesarray = stringutils.tostringarray(aliases);

return new beandefinitionholder(beandefinition, beanname, aliasesarray);

} //當解析出錯時,返回null

return null;

}protected void checknameuniqueness(string beanname, listaliases, element beanelement)

if (foundname == null)

if (foundname != null)

this.usednames.add(beanname);

this.usednames.addall(aliases);

}//詳細對元素中配置的bean定義其他屬性進行解析

//由於上面的方法中已經對bean的id、name和別名等屬性進行了處理

//該方法中主要處理除這三個以外的其他屬性資料

@nullable

public abstractbeandefinition parsebeandefinitionelement(

element ele, string beanname, @nullable beandefinition containingbean)

string parent = null;

if (ele.hasattribute(parent_attribute))

try

catch (classnotfoundexception ex)

catch (noclassdeffounderror err)

catch (throwable ex)

finally

//解析元素出錯時,返回null

return null;

}

只要使用過spring,對spring 配置檔案比較熟悉的人,通過對上述原始碼的分析,就會明白我們在spring配置檔案中元素的中配置的屬性就是通過該方法解析和設定到bean 中去的。

注意:在解析元素過程中沒有建立和例項化bean 物件,只是建立了bean 物件的定義類beandefinition,將元素中的配置資訊設定到beandefinition 中作為記錄,當依賴注入時才使用這些記錄資訊建立和例項化具體的bean 物件。

上面方法中一些對一些配置如元資訊(meta)、qualifier 等的解析,我們在spring 中配置時使用的也不多,我們在使用spring 的元素時,配置最多的是屬性,因此我們下面繼續分析原始碼,了解bean 的屬性在解析時是如何設定的。

基於Xml 的IOC 容器 獲得配置路徑

首先,呼叫父類容器的構造方法 super parent 方法 為容器設定好bean 資源載入器。靜態初始化塊,在整個容器建立過程中只執行一次 static this.resourcepatternresolver getresourcepatternresolver this setparent p...

基於Xml 的IOC 容器 分配解析策略

xmlbeandefinitionreader 類中的doloadbeandefinition 方法是從特定xml 檔案中實際載入bean 配置資源的方法,該方法在載入bean 配置資源之後將其轉換為document 物件,接下來呼叫registerbeandefinitions 啟動spring ...

IOC容器 Bean管理 基於XML方式(一)

ioc容器 bean管理操作 spring ioc 控制反轉 建立和呼叫物件交給spring管理 使用ioc的目的 為了降低耦合度 xml解析 工廠模式 反射 ioc思想基於ioc容器完成,ioc底層就是物件工廠 ioc操作bean管理 a bean管理就是兩個操作 1 spring建立物件 2 s...