<mvc:annotation-driver />是一种简写形式,作用就是简化手动配置。要想知道它做了什么它的解析类就好了。
spring-webmvc包下有个MvcNamespaceHandler就是专门处理,mvc命名空间下的标签的。(这里可以看到所谓的命名空间也就是为了分类处理配置)。MvcNamespaceHandler的init()方法注册了许多解析器,其中AnnotationDrivenBeanDefinitionParser解析器就是用于解析“annotation-driven”的。
可以看到这个解析器做了以下事情:
1.注册以下HandlerMapping:
RequestMappingHandlerMapping
BeanNameUrlHandlerMapping
2.注册以下HandlerAdapter:
RequestMappingHandlerAdapter
HttpRequestHandlerAdapter
SimpleControllerHandlerAdapter
以及注册几个HandlerExceptionResolver、AntPathMatcher。(我们不关注)
我们比较关注HandlerMapping和HandlerAdapter,其实就算我们完全不配置,DispatcherServlet类也会读取DispatcherServlet.properties资源文件做一些默认配置,在DispatcherServlet.properties中
HandlerMapping默认配置的是:
BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping
HandlerAdapter默认配置的是:
HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapter
而解析<mvc:annotation-driver />过程在配置RequestMappingHandlerAdapter时,会自动注册一些MessageConverter用于返回时将结果转换成想要的数据格式。比如有些时候需要将结果转成json放入ResponseBody返回,则需要注册MappingJackson2HttpMessageConverter。解析类会检查路径中是否存在
"com.fasterxml.jackson.databind.ObjectMapper"和"com.fasterxml.jackson.core.JsonGenerator"两个类(存在于jackson的jar包中),如果存在则注册MappingJackson2HttpMessageConverter。因此就必须加入相关的包,然后选择配置<mvc:annotation-driver />或者手动配
<bean id="jsonConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonConverter" />
</list>
</property>
</bean>