Spring XML解析过程

来源:互联网 发布:tplink访客网络是什么 编辑:程序博客网 时间:2024/05/21 13:16

DispatcherServlet是spring的入口
XML解析分为两个部分

一、默认元素解析

1、默认元素有四个,分别为import、alias、bean、beans。

2、解析过程

二、解析自定义元素

解析过程

1、根据标签头找对应的uri去spring.handles找处理类.

贴上例子代码

<beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"    xmlns:context="http://www.springframework.org/schema/context"    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"    xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd         http://www.springframework.org/schema/mvc         http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd         http://www.springframework.org/schema/context         http://www.springframework.org/schema/context/spring-context-3.2.xsd         http://www.springframework.org/schema/aop         http://www.springframework.org/schema/aop/spring-aop-3.2.xsd         http://www.springframework.org/schema/tx         http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">    <!-- 可以扫描controller、service、...    这里让扫描controller,指定controller的包     -->    <context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>    <!-- 静态资源解析    包括 :js、css、img、..     -->     <mvc:resources location="/js/" mapping="/js/**"/>     <mvc:resources location="/img/" mapping="/img/**"/>    <!--注解映射器 -->    <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> -->    <!--注解适配器 -->    <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> -->    <!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置    mvc:annotation-driven默认加载很多的参数绑定方法,    比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter    实际开发时使用mvc:annotation-driven     -->    <mvc:annotation-driven conversion-service="conversionService"    validator="validator"></mvc:annotation-driven>    <!--拦截器 --><mvc:interceptors>    <!--多个拦截器,顺序执行 -->    <!-- 登陆认证拦截器 -->    <mvc:interceptor>        <mvc:mapping path="/**"/>        <bean class="cn.itcast.ssm.interceptor.LoginInterceptor"></bean>    </mvc:interceptor>    <mvc:interceptor>        <!-- /**表示所有url包括子url路径 -->        <mvc:mapping path="/**"/>        <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean>    </mvc:interceptor>    <mvc:interceptor>        <mvc:mapping path="/**"/>        <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean>    </mvc:interceptor></mvc:interceptors></beans>
public class ContextNamespaceHandler extends NamespaceHandlerSupport {    @Override    public void init() {        registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser());        registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser());        registerBeanDefinitionParser("annotation-config", new AnnotationConfigBeanDefinitionParser());        registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser());        registerBeanDefinitionParser("load-time-weaver", new LoadTimeWeaverBeanDefinitionParser());        registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());        registerBeanDefinitionParser("mbean-export", new MBeanExportBeanDefinitionParser());        registerBeanDefinitionParser("mbean-server", new MBeanServerBeanDefinitionParser());    }}

在上面代码中,context和mvc都属于自定义元素。spring根据标签头context找到对应的URI:”http://www.springframework.org/schema/context“,再去spring.handles找到匹配的处理类。
spring.handles源码

http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandlerhttp\://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandlerhttp\://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandlerhttp\://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandlerhttp\://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler

可知context标签的处理类为org.springframework.context.config.ContextNamespaceHandler,该类代码为:

public class ContextNamespaceHandler extends NamespaceHandlerSupport {    @Override    public void init() {        registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser());        registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser());        registerBeanDefinitionParser("annotation-config", new AnnotationConfigBeanDefinitionParser());        registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser());        registerBeanDefinitionParser("load-time-weaver", new LoadTimeWeaverBeanDefinitionParser());        registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());        registerBeanDefinitionParser("mbean-export", new MBeanExportBeanDefinitionParser());        registerBeanDefinitionParser("mbean-server", new MBeanServerBeanDefinitionParser());    }}

相应的标签对应相应的解析类。

原创粉丝点击