Spring IOC 之 獲取 Document 對象

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  
相關文章
相關標籤/搜索