美文网首页
Spring自定义命名空间加载过程

Spring自定义命名空间加载过程

作者: 雪地脚印 | 来源:发表于2016-03-05 23:35 被阅读0次

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

相关文章

网友评论

      本文标题:Spring自定义命名空间加载过程

      本文链接:https://www.haomeiwen.com/subject/kacakttx.html