源码记录 4. XmlBeanFactory读取XML配置文件生成Document的过程 - Smile-Liu/spex GitHub Wiki

XmlBeanFactory读取XML配置文件生成Document的过程

  1. 使用classloader.getResourceAsStream(xmlLocation)加载配置文件为InputStream 这一步是委托给 XmlBeanDefinitionReader来做的,xmlBeanDefinitionReader.loadBeanDefinitions()

  2. 实例化EntityResolver EntityResolver的功能是读取xsd或dtd定义文件 在spring.schemas文件中指定namespace对应的具体文件路径,使用Properties读取spring.schemas属性文件, 然后根据systemId来找到具体路径 通过实现EntityResolver接口,在resolveEntity方法中定义读取xsd定义,并返回定义文件的InputSource。

对于resolveEntity方法的参数 publicId和systemId: 当为XSD模式时,publicId为null,systemId为指定的namespace 当为DTD模式时,publicId和systemId都有值

  1. 实例化ErrorHandler ErrorHandler的功能是处理错误提示

4.使用JDK自带工具包的DocumentBuilderFactory和DocumentBuilder,把EntityResolver和ErrorHandler当做参数,调用documentBuilder.parse(inputStream)解析配置文件为Document

documentBuilder.setEntityResolver()
documentBuilder.setErrorHandler()

这一步是委托给DocumentLoader来做的,documentLoader.loadDocument()

public Document loadDocument(InputStream is, EntityResolver entityResolver, ErrorHandler errorHandler,
    int validationMode, boolean namespaceAware) throws Exception {
		
    DocumentBuilderFactory factory = createDocumentBuilderFactory(validationMode, namespaceAware);
    DocumentBuilder documentBuilder = createDocumentBuilder(factory, entityResolver, errorHandler);
    return documentBuilder.parse(is);
}