spring原始碼 1 xml的載入與註冊

2021-07-30 15:43:21 字數 4130 閱讀 3071

resource resource =

1.資源載入

classpathresource 分析

spring 框架提供bean的載入機制,定義在xml中注入的bean將被建立。

通過構造方法

其它方法

1. getpath 獲取路徑

2. getclassloader 獲取類載入器

3. exists 資源解析存在性

4. getinputstream 獲取輸入流

5. geturl 獲取url

6. createrelative 建立相對資源路徑

7. getdescription 獲取clazz 類名 + path 資訊

/**

* classpath 下資源載入

*/public

class

classpathresource

extends

abstractfileresolvingresource

public

classpathresource(string path, classloader classloader)

this.path = pathtouse;

this.classloader = (classloader != null ? classloader : classutils.getdefaultclassloader());

}

stringutils cleanpath(path) 原始碼解析

clanpath 是對path路徑的乙個簡單處理。
/**

* 例2

*/public

static string cleanpath(string path)

//windows_folder_separator = "\\" folder_separator = "/"

/** * 效果等同於string.replaceall (使用stringbuffer)

* 用stringbuilder效率更快

*/string pathtouse=replace(path, windows_folder_separator, folder_separator);

int prefixindex=pathtouse.indexof(":");

string prefix="";

if (prefixindex != -1)

}if (pathtouse.startswith(folder_separator))

/*** 以/ 切割 string用正則且步驟繁瑣,

*/string patharray=delimitedlisttostringarray(pathtouse, folder_separator);

listpathelements=new linkedlist<>();

int tops=0;

for (int i=patharray.length - 1; i >= 0; i--) else

if (top_path.equals(element)) else else }}

// remaining top paths need to be retained.

for (int i=0; i < tops; i++)

return prefix + collectiontodelimitedstring(pathelements, folder_separator);

}

2.資源解析

xmlbeanfactory (已過時)

直接使用defaultlistablebeanfactory (主要是對bean 註冊後的處理)以及xmlbeandefinitionreader (資源檔案讀取 解析 及註冊)

// 用於從xml中讀取 beandefinition

@deprecated

@suppresswarnings()

public

class

xmlbeanfactory

extends

defaultlistablebeanfactory

public

xmlbeanfactory(resource resource, beanfactory parentbeanfactory) throws bean***ception

}

2.1資源解析-xml驗證

xmlvalidationmodedetector 原始碼分析(獲取xml 後 ,對xml 約束檔案解讀 ,進行驗證)

// 1 auto  2 dtd 3 xsd(schema) : xml 驗證模式 

public

intdetectvalidationmode(inputstream inputstream) throws ioexception

if (hasdoctype(content))

if (hasopeningtag(content))

}return (isdtdvalidated ? validation_dtd : validation_xsd); //dtd 或者xsd(schema)

}catch (charconversionexception ex)

finally

}

2.2資源解析-解析為document

defaultdocumentloader原始碼分析

//xml -》 document -》 bean

@override

// 資源 物件解析器 錯誤處理器 xml驗證 xml命名空間 //由resourceloader =》 獲取

public document loaddocument(inputsource inputsource, entityresolver entityresolver,

errorhandler errorhandler, int validationmode, boolean namespaceaware) throws exception

documentbuilder builder = createdocumentbuilder(factory, entityresolver, errorhandler);

return builder.parse(inputsource);

}

2.3資源解析-beandefinition 註冊

xmlbeandefinitionreader 分析(資源檔案讀取 解析 及註冊)

**

* 資源檔案讀取 解析 及註冊

*/public

class

xmlbeandefinitionreader

extends

abstractbeandefinitionreader

//通過屬性記錄已經載入過的資源

setcurrentresources = this.resourcescurrentlybeingloaded.get();

if (currentresources == null)

if (!currentresources.add(encodedresource))

try

轉化、解析document

//2.新建 beandefinitiondocumentreader (//定義讀取document 並註冊beandefinition功能)

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

}finally

}catch (ioexception ex)

finally }}

}//註冊beandefinition 個數

public

intregisterbeandefinitions(document doc, resource resource) throws beandefinitionstoreexception

spring入門學習 1 xml配置檔案載入方式

載入xml配置檔案方式 1 xmlbeanfactory 引用資源 spring 4已經廢棄 resource resource new classpathresource spring.xml beanfactory factory new xmlbeanfactory resource 3 用檔...

Spring原始碼之XML解析

資料準備階段 準備的目的是封裝 resource引數,目的是為了考慮到 resource可能存在編碼要求的情況,其次,通過 sax讀取 xml檔案的方式來準備 inputsource物件,最後將引數傳遞到 最核心的實現部分 doloadbeandefinitions inputsource,enco...

Spring 原始碼閱讀(1)

這週在學習spring的原始碼,常常迷失在 森林中,因為英語水平不高,常常需要借助google翻譯幫忙解釋注釋,所以速度比較慢。下面是我模擬spring的解析xml,依賴注入的過程,比較簡略。node node nodes.item i if node instanceof element claz...