【死磕 Spring】----- IOC 之 獲取驗證模型
在上篇部落格ofollow,noindex">【死磕Spring】----- IOC 之 載入 Bean
中提到,在核心邏輯方法doLoadBeanDefinitions()
中主要是做三件事情。
●
呼叫
getValidationModeForResource()
獲取 xml 檔案的驗證模式
●
呼叫
loadDocument()
根據 xml 檔案獲取相應的 Document 例項。
●
呼叫
registerBeanDefinitions()
註冊 Bean 例項。
這篇部落格主要分析獲取 xml 檔案的驗證模式。
XML 檔案的驗證模式保證了 XML 檔案的正確性
DTD 與 XSD 的區別
DTD(Document Type Definition),即文件型別定義,為 XML 檔案的驗證機制,屬於 XML 檔案中組成的一部分。DTD 是一種保證 XML 文件格式正確的有效驗證方式,它定義了相關 XML 文件的元素、屬性、排列方式、元素的內容型別以及元素的層次結構。其實 DTD 就相當於 XML 中的 “詞彙”和“語法”,我們可以通過比較 XML 檔案和 DTD 檔案 來看文件是否符合規範,元素和標籤使用是否正確。
要在 Spring 中使用 DTD,需要在 Spring XML 檔案頭部宣告:
DTD 在一定的階段推動了 XML 的發展,但是它本身存在著一些缺陷:
● 它沒有使用 XML 格式,而是自己定義了一套格式,相對解析器的重用性較差;而且 DTD 的構建和訪問沒有標準的程式設計介面,因而解析器很難簡單的解析 DTD 文件。
● DTD 對元素的型別限制較少;同時其他的約束力也叫弱。
● DTD 擴充套件能力較差。
● 基於正則表示式的 DTD 文件的描述能力有限。
針對 DTD 的缺陷,W3C 在 2001 年推出 XSD。XSD(XML Schemas Definition)即 XML Schema 語言。XML Schema 本身就是一個 XML文件,使用的是 XML 語法,因此可以很方便的解析 XSD 文件。相對於 DTD,XSD 具有如下優勢:
● XML Schema基於XML,沒有專門的語法
● XML Schema可以象其他XML檔案一樣解析和處理
● XML Schema比DTD提供了更豐富的資料型別.
● XML Schema提供可擴充的資料模型。
● XML Schema支援綜合名稱空間
● XML Schema支援屬性組。
getValidationModeForResource() 分析
如果指定了 XML 檔案的的驗證模式(呼叫XmlBeanDefinitionReader.setValidating(booleanvalidating)
)則直接返回指定的驗證模式,否則呼叫detectValidationMode()
獲取相應的驗證模式,如下:
前面一大堆的程式碼,核心在於this.validationModeDetector.detectValidationMode(inputStream)
,validationModeDetector 定義為XmlValidationModeDetector
,所以驗證模式的獲取委託給XmlValidationModeDetector
的detectValidationMode()
方法。
從程式碼中看,主要是通過讀取 XML 檔案的內容,判斷內容中是否包含有 DOCTYPE ,如果是 則為 DTD,否則為 XSD,當然只會讀取到 第一個 "<" 處,因為 驗證模式一定會在第一個 “<” 之前。如果當中出現了 CharConversionException 異常,則為 XSD模式。
好了,XML 檔案的驗證模式分析完畢,下篇分析doLoadBeanDefinitions()
的第二個步驟:獲取 Document 例項。
原文釋出時間為:2018-09-10
本文作者:chenssy