Spring原始碼之XML解析

2021-08-02 08:24:45 字數 3261 閱讀 5085

資料準備階段

準備的目的是封裝

resource引數,目的是為了考慮到

resource可能存在編碼要求的情況,其次,通過

sax讀取

xml檔案的方式來準備

inputsource物件,最後將引數傳遞到

最核心的實現部分

doloadbeandefinitions(inputsource,encodedresource.getresource())

封裝resource 呼叫

xmlbeandefinitionreader的

loadbeandefinitions(resource resource)方法時,首先將resource物件進行再次封裝成

encodedresource,檢視原始碼可以發現裡面增加了字符集和編碼的封裝,從命名上來看也可以體現出來,將資源封裝完成後,就呼叫過載的同名函式

loadbeandefinitions(encodedresource resource)進行正式的解析.

資料準備操作

在過載方法裡面首先通過

setcurrentresources屬性來記錄已經載入的資源,其次,從

encodedresource物件中獲取封裝好的

resource物件,並獲取其

inputstream,將獲取到的輸入流與sax解析的

inputsource繫結,接下來就進入到了核心的實現部分:

doloadbeandefinitions(inputsource,encodedresource.getresource())

核心實現

核心部分有兩個關鍵步驟:

呼叫doloaddocument(inputsource.resource)方法獲取document

根據返回的document資訊註冊bean資訊

這兩個步驟支援著整個

spring容器部分的實現基礎

獲取document

進入方法體後,將

document的建立交給

defaultdocumentloader documentloader屬性的

loaddocument()方法,該方法宣告如下:

document loaddocument( inputsource inputsource, entityresolver entityresolver, errorhandler errorhandler, int validationmode, boolean namespaceaware) throws exception;

呼叫情況:

documentloader.loaddocument(inputsource, getentityresolver(), this.errorhandler, getvalidationmodeforresource(resource), isnamespaceaware())

在這個介面中定義了乙個方法

inputsource resolveentity (string publicid,string systemid) throws saxexception, ioexception;

如果解析的驗證模式是

xsd:

<?xml version="1.0" encoding="utf-8"?>

那麼.此時得到的兩個引數值分別是:

publicid:null

systemid:

如果解析的驗證模式是

dtd:

<?xml version="1.0" encoding="utf-8"?>

那麼,此時得到的兩個引數值分別是:

publicid:-//spring//dtd bean 2.0//en

systemid:

而對於不同的驗證模式,

spring使用了不同的解析器,當使用

dtd驗證時,

spring會擷取後面的

*.dtd,並直接到當前目錄去尋找,當使用

xsd驗證時,

spring會到

meta-inf/spring.schemas檔案中去匹配相應的

systemid並載入對應的

xsd檔案

首先,為了保證

xml檔案的正確性,有常見兩種驗證模式:

dtd、

xsd兩種驗證模式的區別

我對這兩種的區別目前還不是很詳細,只能簡略的給出定義,但我看到的

最直觀的區別是,

dtd驗證需要單獨寫出乙個標籤

,而 xsd驗證會將資訊寫入

結點dtd

dtd(document type definition)即文件型別定義,是一種保證

xml文件格式正確的有效方法,可以通過比較

xml文件和

dtd檔案來看文件是否符合規範.

xsd

xml schema語言就是

xsd(xml schema definition),描述了

xml文件的結構,可以用乙個指定的

xml schema來驗證

xml文件,以檢查文件是否符合要求.

驗證模式的讀取

驗證模式的讀取非常簡單,在

getvalidationmodeforresource(resource)方法中先獲取當前設定的驗證模式是不是自動選擇,原始碼中是這麼解釋的

since we cannot find a clear indication,當找不到乙個確切的驗證模式時,採用這種方式,然後判斷當前

resource物件中採用的是什麼驗證模式,通過檢索字串的方式,當存在

doctype的時候,就採用dtd驗證模式,否則採用

xsd驗證模式

解析並註冊

beandefinitions

在上一步得到

docment物件之後,呼叫

registerbeandefinitions(document doc,resource resource)

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

而在呼叫

documentreader物件方法中,才開始進行正式的解析工作

public void registerbeandefinitions(document doc, xmlreadercontext readercontext)

解析的工作全權交給

doregisterbeandefinition(root)方法實現,這樣

xml檔案就正式進入了解析步驟

spring解析xml文件原始碼解析

xml文件的解析有兩種形式 dom解析和sax解析,以前一直都聽說spring解析xml是dom解析,最近閒著沒事翻看了spring的原始碼,對解析過程有了一點了解,做個記錄。xmlbeandefinitionreaderdoloaddocument inputsource inputsource,...

Spring原始碼解析之 Aop原始碼解析(2)

spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...

Spring 原始碼解析之BeanFactory介面

beanfactory介面是spring 容器的根介面,其他介面和類通過對這個介面的實現物件的例項化,通過對該介面的控制,實現對目標物件的例項化。string factory bean prefix 用於取消對beanfactory例項的引用區分factory和其實例,如果是 返回factory,否...