1.自动注册映射处理器和适配器

这是该注解的主要功能,添加< mvc:annotation-driven/>注解后,容器中会<自动注册HandlerMapping与HandlerAdapter 两个bean。省去手动注册HandlerMapping和HandlerAdapter的步骤。

当配置了< mvc:annotation-driven/>后,Spring就知道了我们启用注解驱动。然后Spring通过< context:component-scan/>标签的配置,会自动为我们将扫描到的@Component,@Controller,@Service,@Repository等注解标记的组件注册到工厂中,来处理我们的请求。

HandlerMapping的实现类的作用:将请求映射到带@RequestMapping注释的控制器方法,将URL路径映射到控制器bean名称。
HandlerAdapter的实现类的作用:实现类RequestMappingHandlerAdapter,处理请求的适配器,确定调用哪个类的哪个方法,并且构造方法参数,返回值。

在spring mvc 3.1以上,DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter对应变更为:
DefaultAnnotationHandlerMapping -> RequestMappingHandlerMapping
AnnotationMethodHandlerAdapter -> RequestMappingHandlerAdapter
AnnotationMethodHandlerExceptionResolver -> ExceptionHandlerExceptionResolver

2.映射异常处理

处理@ExceptionHandler标注的异常处理函数:在dispatcherServlet中,当用户未注册自定义的ExceptionResolver时,自动注册AnnotationMethodHandlerExceptionResolver来对使用@ExceptionHandler标注的异常处理函数进行解析处理(这也导致当用户注册了自定义的exeptionResolver时将可能导致无法处理@ExceptionHandler)。

3.数据校验

官方文档解释:“默认情况下,当在类路径中检测到诸如Hibernate Validator之类的Bean验证提供程序时,使用@EnableWebMvc或<mvc:annotation-driven>会通过LocalValidatorFactoryBean在Spring MVC中自动注册Bean验证支持。”

要实现Hibernate Validator/JSR303 校验(或者其他各种校验),必须实现SpringMVC提供的一个接口:ValidatorFactory。LocalValidatorFactoryBean是ValidatorFactory的一个实现类。<mvc:annotation-driven ></mvc:annotation-driven>会在springmvc容器中自动加载一个LocalValidatorFactoryBean类,因此可以直接实现数据校验。

就日常使用来说,比如支持@Valid等一系列校验注解。

4.数据类型转换和数据格式化

< mvc:annotation-driven/>支持ConversionService,可以进行常见数据类型的转换和格式化。

ConversionService:定义了一个统一的API,用于在运行时执行类型转换逻辑。大多数ConversionService实现还实现ConverterRegistry,该注册器提供用于注册转换器的SPI。在内部,ConversionService实现委派其注册的转换器执行类型转换逻辑。
ConversionService会在应用程序启动时实例化,然后在多个线程之间共享。
在Spring应用程序中,通常会为每个Spring容器(或ApplicationContext)配置一个ConversionService实例。

FormattingConversionServiceFactoryBean:一个工厂,提供对FormattingConversionService的便捷访问,该服务配置有用于常见类型(例如数字和日期时间)的转换器和格式化程序。

①默认:
添加 < mvc:annotation-driven/>后,会默认创建一个ConversionService,即 FormattingConversionServiceFactoryBean。
使用FormattingConversionServiceFactoryBean可以让SpringMVC支持@NumberFormat和@DateTimeFormat等Spring内部自定义的转换器。

②:自定义:
默认的ConversionService可以在字符串,数字,枚举,集合,映射和其他常见类型之间进行转换。
如果要实现其他的类型转换,比如将字符串 “LiHua”-23-“男” 转换为Student实体类,可以自定义类型转换器。
要支持自己自定义的格式器和转换器(实现Converter,ConverterFactory或GenericConverter接口),只需自定义相应的类并加入IOC容器,然后通过设置converters属性将自定义的转换器注册到ConversionService即可。

XML配置文件:

   <mvc:annotation-driven conversion-service="conversionService"/><bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><set><ref bean="employeeConverter"/></set></property></bean>

5.支持使用@RequestBody、@ResponseBody

这个没什么好说的了。

6.支持静态资源文件加载和请求映射同时使用

在配置完静态资源访问后,如果没有配置< mvc:annotation-driven/>,springmvc将只能访问静态资源,而无法进行请求映射。
因此,有静态资源文件需要加载的时候,一定要配置< mvc:annotation-driven/>。

< mvc:annotation-driven/>允许将DispatcherServlet映射到“ /”(从而覆盖了容器默认Servlet的映射),同时仍允许容器默认Servlet处理静态资源请求。 它使用URL映射“ / **”配置DefaultServletHttpRequestHandler,并且相对于其他URL映射具有最低优先级。

关于静态资源访问的配置:
在springmvc中,直接访问静态资源会404,因为之前配置的拦截器会将所有的请求通过/拦截,交给mvc的入口DispatcherServlet去匹配@RequestMapping/path,访问不到就报错了。

解决:如果是需要mvc处理的,则交给@RequestMapping;如果不需要mvc处理,则使用服务器(Tomcat)默认的servlet处理:对应的请求交给servlet处理,没有对应的servlet则直接访问。默认的servlet在Tomcat配置文件\conf/web.xml中。

加载静态资源的三种方案:
①使用< mvc:default-servlet-handler/>。
②配置/XX /**将静态资源文件映射到 ResourceHttpRequestHandler 进行处理。

 <mvc:resources mapping="/js/**" location="/js/"></mvc:resources><mvc:resources mapping="/css/**" location="/css/"></mvc:resources>1

③激活Tomcat的defaultServlet来处理静态文件。

<servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.css</url-pattern>
</servlet-mapping>1234567891011

注意:如果不使用< mvc:resources/>注册HandlerMapping,而要设置自己的自定义HandlerMapping实例,请确保将其order属性设置为小于DefaultServletHttpRequestHandler的Integer.MAX_VALUE的值。
因为spring 会先执行 order 值比较小的,默认的应该servlet在最后执行,以便于处理不可能进行请求映射的静态资源访问。
补充理解:
DefaultAnnotationHandlerMapping 的 order 属性值是:0。
<mvc:resources/ >自动注册的 SimpleUrlHandlerMapping 的 order 属性值是: 2147483646。
< mvc:default-servlet-handler/>自动注册的 SimpleUrlHandlerMapping 的 order 属性值是:2147483647。
因此映射的顺序是:注解映射——<mvc:resources/ >映射的静态资源——< mvc:default-servlet-handler/> 兜底。

7.其他功能

启用矩阵变量:在MVC命名空间中,<mvc:annotation-driven>元素具有应设置为true的enable-matrix-variables属性。 默认情况下,它设置为false。

配置异步请求处理:MVC Java配置和MVC名称空间提供用于配置异步请求处理的选项。 WebMvcConfigurer具有方法configureAsyncSupport,而<mvc:annotation-driven>具有子元素。

创建ContentNegotiationManager:在MVC命名空间中,<mvc:annotation-driven>元素具有content-negotiation-manager属性,该属性期望可以使用ContentNegotiationManagerFactoryBean创建ContentNegotiationManager。

数据绑定支持。

…(我应该没说全,还有别的功能,用到的时候再说吧)

8.< mvc:annotation-driven /> 和< context:annotation-config/>的关系:

< mvc:annotation-driven />:虽然有这么多功能,但主要还是为了Spring MVC来用的,提供Controller请求转发,json自动转换等功能。

< context:annotation-config/>:向 Spring 容器注册 4 个BeanPostProcessor。注册这4个 BeanPostProcessor的作用,就是为了系统能够识别相应的注解。常见的如:@ Resource 、@Required、@Autowired等。
不过,其实包扫描配置<context:component-scan base-package=”XX.XX”/> 也提供上述功能,因此当启动用了包扫描就不必再配置< context:annotation-config/>了。

mvc:annotation-driven 注解的作用相关推荐

  1. Spring MVC 的常用注解

    主要是这四种注解的:@Controller.@RequestMapping.@RequestParam .@Responsebody @Controller @Controller注解是在Spring ...

  2. Android -- Annotation(注解)原理详解及常见框架应用

    1,我们在上一篇讲到了EventBus源码及3.0版本的简单使用,知道了我们3.0版本是使用注解方式标记事件响应方法的,这里我们就有一个疑问了,为什么在一个方法加上类似于"@Subscrib ...

  3. Asp.Net Mvc之模型注解

    Asp.Net Mvc之模型注解 正文: 命名空间: using System.ComponentModel;      using System.ComponentModel.DataAnnotat ...

  4. android注解的作用,Android 用注解来提升代码质量

    Android 用注解来提升代码质量 Android,注解,annotation 2018.07.13 Android 提供了一个注解的 support 包,这个注解包配合 IDE 可以用来提升我的代 ...

  5. 注解的作用 常用注解

    注解是告知编译器要做什么事情的说明,在程序中可以对任何元素进行注解,包括Java包.类.构造方法.域.方法.参数以及局部变量. 注解就像修饰符一样,使用时在其前面增加@符号,用于修饰包.类.构造方法. ...

  6. Spring中@AliasFor注解的作用及原理

    本文基于Springboot 2.1.6.RELEASE 版本分析. 关于@AliasFor注解,曾提过的一个issue Explicit attribute overrides configured ...

  7. Annotation(注解)是什么?

    Annotation(注解)是什么? 附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能. 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 jav ...

  8. 一文总结Spring 注解及作用详解

    文章目录 开启注解扫描配置 @RequestMapping 声明bean的注解 注入bean的注解 spring配置文件中读取properties配置文件 j配置类相关注解 切面(AOP)相关注解 @ ...

  9. Spring Ioc注解式开发中注解的作用

    Spring Ioc注解式开发中注解的作用 目标:本章节注重于Spring Ioc的注解式开发之中注解的作用. 基于注解的DI实现IOC 1.定义bean而注解 a.@Component @Repos ...

  10. @getmapping注解的作用_一口气说出6种,@Transactional注解的失效场景

    作者:程序员内点事 引言 昨天公众号粉丝咨询了一个问题,说自己之前面试被问@Transactional注解哪些场景下会失效,一时语塞致使面试失败.所以今天简单的和大家分享一下@Transactiona ...

最新文章

  1. 谷歌 Daydream 实验室:VR中学习新技能是一种怎样的体验?
  2. [C#] - 从 HTML 代码中 转换 / 提取 可读文字(PlainText)的方法
  3. 巡逻机器人用应用的pc端车牌识别
  4. Spring Reactive已经过时了吗? 螺纹连接反转
  5. 《scikit-learn》通过GridSearchCV来进行超参数优化
  6. (1)散列表(哈希表)的定义
  7. WEB前端性能优化基本套路
  8. jvm初体验:堆溢出处理
  9. UVA11019 Matrix Matcher【hash傻逼题】【AC自动机好题】
  10. Java中方法中的参数传递
  11. linux下载上传速度查看
  12. 593. 有效的正方形
  13. leach算法的实现过程_LEACH-REC算法的研究及实现
  14. 用浏览器怎样监控网页内容变化
  15. 输入平方尺转换为平方米 计算机,如何用电脑打出平方?平方米符号输入步骤教程...
  16. 关于UVC PTZ功能
  17. 求问,如何计算距离一个经纬度坐标点500㎞范围内的半圆面积平均?
  18. 【运筹学】线性规划 图解法 ( 唯一最优解 | 无穷最优解 | 无界解 | 无可行解 )
  19. 室外温度已达34度,本博客提供自助风扇服务
  20. 【亚稳态、建立时间和保持时间】亚稳态的产生原因、危害及解决方法

热门文章

  1. pythonint函数的参数_向嵌入的Python函数传递两个参数(int和array)
  2. php文件上传前端页面样式,HTML实现美化上传文件样式
  3. [转载] java如何实现一个字符串的反转和替换
  4. 8086 寻址方式_8086微处理器的不同寻址模式
  5. python 示例_在Python中带有示例的while关键字
  6. tsql是mysql中的吗_Mysql中的sql是如何执行的
  7. client netty 主动发数据_netty案例,netty4.1基础入门篇十一《netty udp通信方式案例Demo》...
  8. hanlp 训练模型_LTP 4.0!单模型完成6项自然语言处理任务
  9. sql服务器默认密码_搭建一个DNS服务器,轻松实现域名解析内容分发,访问速度提高N倍...
  10. 再见 Spring Task,这个定时任务框架真香!