zoukankan      html  css  js  c++  java
  • <mvc:annotation-driven>注册了什么

    前言

       上一篇文章dispatcherservlet初始化中提到,如果没有配置handlermapping就会采取默认的策略进行配置handlermapping,这篇文章就要讲述mvc:annotation-driven对默认策略的改变。它背后到底注册了哪些HandlerMapping和HandlerAdapter。 

    1. 配置mvc:annotation-driven

    在dispatcherservlet对应的配置文件上有这样一段配置

        <mvc:annotation-driven />
        
        <aop:aspectj-autoproxy proxy-target-class="true"/>
        
        <mvc:interceptors>
            <ref bean="performanceLogInterceptor"></ref>
            <ref bean="concurrentCtrlInterceptor"></ref>
            <ref bean="authenticationInterceptor"></ref>
            <ref bean="authorityInterceptor"></ref>
            <ref bean="tpsControlInterceptor"></ref> 
        </mvc:interceptors>

    开启了<mvc:annotation-driven/>,然后我们会找到这样的一个实现类AnnotationDrivenBeanDefinitionParser解析处理这个标签

    /**
    *这里清清楚楚写着该类是专门处理 <mvc:annotation-driven/>标签的 
    * A {@link BeanDefinitionParser} that provides the configuration for the * {@code <annotation-driven/>} MVC namespace element
    *
    *这里说明了注册的HandlerMapping * <p>This class registers the following {
    @link HandlerMapping}s:</p> * <ul> * <li>{@link RequestMappingHandlerMapping} * ordered at 0 for mapping requests to annotated controller methods. * <li>{@link BeanNameUrlHandlerMapping} * ordered at 2 to map URL paths to controller bean names. * </ul> …… */ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { …… }

    我们来看看mvc:annotation-driven都注册了哪些东西

        @Override
        public BeanDefinition parse(Element element, ParserContext parserContext) {
            Object source = parserContext.extractSource(element);
            XmlReaderContext readerContext = parserContext.getReaderContext();
    
            RootBeanDefinition handlerMappingDef = new RootBeanDefinition(RequestMappingHandlerMapping.class);
    
            ManagedList<?> messageConverters = getMessageConverters(element, source, parserContext);
    
            RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class);
            
    
              ……
    
            RootBeanDefinition exceptionHandlerExceptionResolver = new RootBeanDefinition(ExceptionHandlerExceptionResolver.class);
          
    
            RootBeanDefinition responseStatusExceptionResolver = new RootBeanDefinition(ResponseStatusExceptionResolver.class);
            
    
            RootBeanDefinition defaultExceptionResolver = new RootBeanDefinition(DefaultHandlerExceptionResolver.class);
       // Ensure BeanNameUrlHandlerMapping (SPR-8289) and default HandlerAdapters are not "turned off"
            MvcNamespaceUtils.registerDefaultComponents(parserContext, source);
    
            parserContext.popAndRegisterContainingComponent();
    
            return null;
        }

    MvcNamespaceUtils.registerDefaultComponents的内容如下: 

    public static void registerDefaultComponents(ParserContext parserContext, Object source) {
            registerBeanNameUrlHandlerMapping(parserContext, source);
            registerHttpRequestHandlerAdapter(parserContext, source);
            registerSimpleControllerHandlerAdapter(parserContext, source);
        }

    至此所注册的HandlerMapping和HandlerAdapter我们都找到了。 

  • 相关阅读:
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    64位WIN7系统 下 搭建Android开发环境
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
  • 原文地址:https://www.cnblogs.com/whx7762/p/8118655.html
Copyright © 2011-2022 走看看