XmlBeanDefinitionReader.doLoadDocument() 方法中作了兩件事情spring
- 一是調用 getValidationModeForResource() 獲取 XML 的驗證模式
- 二是調用 DocumentLoader.loadDocument() 獲取 Document 對象
DocumentLoader 中只有一個方法 loadDocument()
,該方法接收五個參數:ui
- inputSource:加載 Document 的 Resource 源
- entityResolver:解析文件的解析器
- errorHandler:處理加載 Document 對象的過程的錯誤
- validationMode:驗證模式
- namespaceAware:命名空間支持。若是要提供對 XML 名稱空間的支持,則爲true
該方法由 DocumentLoader 的默認實現類 DefaultDocumentLoader 實現url
- 首先調用
createDocumentBuilderFactory()
建立 DocumentBuilderFactory
- 再經過該 factory 建立 DocumentBuilder,最後解析 InputSource 返回 Document 對象
EntityResolver
經過 loadDocument()
獲取 Document 對象時,有一個參數 entityResolver ,該參數是經過 getEntityResolver()
獲取的spa
getEntityResolver()
返回指定的解析器,若是沒有指定,則構造一個未指定的默認解析器
- 若是 ResourceLoader 不爲 null,則根據指定的 ResourceLoader 建立一個 ResourceEntityResolver。
- 若是 ResourceLoader 爲null,則建立 一個 DelegatingEntityResolver,該 Resolver 委託給默認的 BeansDtdResolver 和 PluggableSchemaResolver
- ResourceEntityResolver:繼承自 EntityResolver ,經過 ResourceLoader 來解析實體的引用。
- DelegatingEntityResolver:EntityResolver 的實現,分別代理了 dtd 的 BeansDtdResolver 和 xml schemas 的 PluggableSchemaResolver。
- BeansDtdResolver : spring bean dtd 解析器。EntityResolver 的實現,用來從 classpath 或者 jar 文件加載 dtd。
- PluggableSchemaResolver:使用一系列 Map 文件將 schema url 解析到本地 classpath 資源
getEntityResolver()
返回 EntityResolver ,那這個 EntityResolver 究竟是什麼呢?代理
- 若是 SAX 應用程序須要實現自定義處理外部實體,則必須實現此接口並使用
setEntityResolver()
向 SAX 驅動器註冊一個實例
- EntityResolver 的做用就是應用自己能夠提供一個如何尋找驗證文件的方法,即自定義實現
這兩個參數的實際內容和具體的驗證模式有關係。以下code
- XSD 驗證模式
- publicId:null
- systemId:http://www.springframework.org/schema/beans/spring-beans.xsd
- DTD 驗證模式
- publicId:-//SPRING//DTD BEAN 2.0//EN
- systemId:http://www.springframework.org/dtd/spring-beans.dtd