<mvc:annotation-driven />做了什么

<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>

猜你喜欢

转载自xiaoxiaoher.iteye.com/blog/2407945
今日推荐