Spring

落花浮王杯 提交于 2020-08-11 05:57:08

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"文件夹内有两个配置文件用来定义

  1. “spring.handlers” :  定义标签的解析处理类 。

    需要实现抽象类 org.springframework.beans.factory.xml.NamespaceHandlerSupport ( ---> implements org.springframework.beans.factory.xml.NamespaceHandler )

    对 <mvc: ....> 标签的处理类是MvcNamespaceHandler


    每一个子标签的解析类则需要实现接口 org.springframework.beans.factory.xml.BeanDefinitionParser
    package org.springframework.beans.factory.xml;
    
    public interface BeanDefinitionParser {
       @Nullable
    	BeanDefinition parse(Element element, ParserContext parserContext);
    }
  2. “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()方法里面来配置的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!