前言
上一篇文章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我们都找到了。