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我们都找到了。 

  • 相关阅读:
    linux启动流程
    控制nginx并发链接数量和客户端请求nginx的速率
    MySQL修改密码
    nginx站点目录及文件URL访问控制
    nginx日志相关优化安全
    根据参数优化nginx的服务性能
    nginx基本安全优化
    nginx rewrite
    nginx location
    nginx访问日志(access_log)
  • 原文地址:https://www.cnblogs.com/whx7762/p/8118655.html
Copyright © 2011-2022 走看看