SpringMVC mvc:annotation-driven

在实际开发中,<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/>

panchaoxin wechat
关注我的公众号
支持一下