在实际开发中,<mvc:annotation-driven/>是一定要加上的,因为它帮我们做了好多好多事情。没有<mvc:annotation-driven/>,你使用的只是低配的SpringMVC,一旦加上,就是高配的SpringMVC,开启了SpringMVC的开挂模式
<mvc:annotation-driven/> 会自动注册以下3个Bean:
- RequestMappingHandlerMapping
- RequestMappingHandlerAdapter
- ExceptionHandlerExceptionResolver
还将提供以下支持:
- 支持使用 ConversionService 实例对表单参数进行类型转换
- 支持使用 @NumberFormat annotation、@DateTimeFormat 注解完成数据类型的格式化
- 支持使用 @Valid 注解对 JavaBean 实例进行 JSR 303 验证
- 支持使用 @RequestBody 和 @ResponseBody 注解
1. 几个需要<mvc:annotation-driven/>支持的场景说明
1.1. <mvc:default-servlet-handler/>
单独使用<mvc:default-servlet-handler/>,会导致@RequestMapping处理器失效。
既没有配置<mvc:default-servlet-handler/>也没有配置<mvc:annotation-driven/>,Spring容器会注册以下Bean
- HttpRequestHandlerAdapter
- SimpleControllerHandlerAdapter
- RequestMappingHandlerAdapter(Spring旧版本中叫做AnnotationMethodHandlerAdapter)可以处理@RequestMapping
配置了<mvc:default-servlet-handler/>但没有配置<mvc:annotation-driven/>,Spring容器会注册以下Bean。你会发现RequestMappingHandlerAdapter这个组件消失了,所以@RequestMapping就无法处理
- HttpRequestHandlerAdapter
- SimpleControllerHandlerAdapter
配置了<mvc:default-servlet-handler/>也配置了<mvc:annotation-driven/>,Spring容器会注册以下Bean。RequestMappingHandlerAdapter又有了
- HttpRequestHandlerAdapter
- SimpleControllerHandlerAdapter
- RequestMappingHandlerAdapter
因此,<mvc:default-servlet-handler/>必须要有<mvc:annotation-driven/>的支持1
2<mvc:annotation-driven/>
<mvc:default-servlet-handler/>