XmlBeanDefinitionReader入口
DefaultDocumentLoader加载并解析一个XML文件成Document实例,从BeanDefinitionReader中获取EntityResolver和ErrorHandler。
在XmlBeanDefinitionReader中创建BeanDefinitionDocumentReader,在这个BeanDefinitionDocumentReader中遍历Document中的每个Element。
对每个Element,如果是默认的URI(即beans命名空间内的定义),调用parseDefaultElement()方法,否则调用BeanDefinitionParserDelegate中的parseCustomElement()方法。
在parseCustomElement()方法中,它找到当前Element的namespaceURI,然后从NamespaceHandlerResolver中获取自定义的NamespaceHandler,使用该NamespaceHandler来解析这个Element,由于我们已经在init()方法中注册了不同的element name对应的BeanDefinitionParser,因而可以使用这个自定义的BeanDefinitionParser来解析自定义的Element。
其中默认的NamespaceHandlerResolver(DefaultNamespaceHandlerResolver)会找到当前classpath下的所有META-INF/spring.handlers文件,加载进来,读取里面的内容成namespaceURI到NamespaceHandler的map,并初始化所有的NamespaceHandler。
另外一条线,
在DefaultDocumentLoader的EntityResolver使用DelegatingEntityResolver,它对有Schema定义的XML使用PluggableSchemaResolver,这个PluggableSchemaResolver会读取classpath下的所有META-INF/spring.schemas成一个namespaceURI到Schema文件地址的map,对每个自定义的namespaceURI,则从这个Map中获取Schema文件地址,并进行验证。也就是说在这里将schemaLocation中的http://www.levin.com/schema/myns/myns.xsd转换成了levin/learn/ali/spring/myns/config/myns.xsd