Spring的xml中一定是在<beans>中定义了 xmlns (命名空间简称)及 xsi:schemaLocation (命名空间Schema文件)
下文以 spring-webmvc-5.1.7.RELEASE.jar 为例。
<mvc:annotation-driven/>
<mvc:resources mapping="/resources/**/" location="/resources/"/>
在Spring组件jar包内"META-INF"文件夹内有两个配置文件用来定义
- “spring.handlers” : 定义标签的解析处理类 。
需要实现抽象类 org.springframework.beans.factory.xml.NamespaceHandlerSupport ( ---> implements org.springframework.beans.factory.xml.NamespaceHandler )
对 <mvc: ....> 标签的处理类是MvcNamespaceHandler。
每一个子标签的解析类则需要实现接口 org.springframework.beans.factory.xml.BeanDefinitionParserpackage org.springframework.beans.factory.xml; public interface BeanDefinitionParser { @Nullable BeanDefinition parse(Element element, ParserContext parserContext); }
- “spring.schemas” : 在解析XML文件时将XSD重定向到本地文件,避免在解析XML文件时需要上网下载XSD文件。通过现实org.xml.sax.EntityResolver接口来实现该功能。
代码简析
针对于Xml定义的内容解析成BeanDefinition对象处理类是:org.springframework.beans.factory.xml.XmlBeanDefinitionReader。
执行到方法 loadBeanDefinitions -> doLoadBeanDefinitions -> registerBeanDefinitions : 需要先创建 org.springframework.beans.factory.xml.XmlReaderContext
此时,获取到的接口org.springframework.beans.factory.xml.NamespaceHandlerResolver
默认实现类是org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver
在步骤10中根据会根据传入的namespaceUri找到对应的NamespaceHandler,这个映射是在spring.handlers中配置的。
在步骤13中会根据element的名字找到对应的BeanDefinitionParser,这个是在NamespaceHandler.init()方法里面来配置的。
来源:oschina
链接:https://my.oschina.net/u/3434392/blog/4293363