SpringtMVC中配置 <mvc:annotation-driven/> 与 <mvc:default-servlet-handler/> 的作用与源码解析
基于 Spring4.X 来学习 SpringtMVC, 在学习过程中,被“告知”在 XML 配置文件中建议设置如下两项:

一直不明白为什么,但又甘心。于是,花了一点时间来调试源码,想了解清楚为什么需要这样做。
Demo代码地址:
https://github.com/cyhbyw/springMVC_atguigu_TongGang
工程名称:
springMVC_DebugSourceCode
现在开始调试。
====PS:图片可能不是很清晰,可以右击图片、选择在新标签页中查看(效果更好)===
情况一:有这两个标签时
1. 初始化 HandlerMapping 的过程如下,且其中包含 RequestMappingHandlerMapping!如下图所示。

2. 初始化 HandlerAdapter 的过程如下,且其中包含 RequestMappingHandlerAdapter!如下图所示。

情况二:没有这两个标签 (提醒:调试时需要注释掉这两个标签的内容)
1. 初始化 HandlerMapping 的过程如下,且其中包含 DefaultAnnotationHandlerMapping。如下图所示。
从源码中可以看到,它调用了Line588的 getDefaultStrategies() 方法。而有这两个标签时,调用的是Line570的方法。

2. 初始化 HandlerAdapter 的过程如下,且其中包含 AnnotationMethodHandlerAdapter!如下图所示。
从源码中可以看到,它调用了Line626的 getDefaultStrategies() 方法。而有这两个标签时,调用的是Line608的方法。

可以看到,当有、无这两个标签时,SpringtMVC所采用的HandlerMapping、HandlerAdapter是不一样的。对比如下:
| 有这两个标签时 | 没有这两个标签时 | |
| HandlerMapping |
BeanNameUrlHandlerMapping SimpleUrlHandlerMapping RequestMappingHandlerMapping |
BeanNameUrlHandlerMapping DefaultAnnotationHandlerMapping |
| HandlerAdapter |
HttpRequestHandlerAdapter SimpleControllerHandlerAdapter RequestMappingHandlerAdapter |
HttpRequestHandlerAdapter SimpleControllerHandlerAdapter AnnotationMethodHandlerAdapter |
从表中可以看出:
1. 对于HandlerMapping,有标签时比无标签时多出一个 SimpleUrlHandlerMapping。更重要的是,将 DefaultAnnotationHandlerMapping 更新为 RequestMappingHandlerMapping!而从源码中也可以看到,前者已被废弃并建议使用后者。

2. 对于HandlerAdapter,将 AnnotationMethodHandlerAdapter 更新为 RequestMappingHandlerAdapter!同理,前者已被废弃并建议使用后者。

不知道会不会是因为上述原因才建议加上这两个标签的,但是,总归来说,使用已过时被废弃的类总是不好的吧。所以,即使没有其它更多理由,还是遵循建议,加上这两个标签吧。
自己还知道的建议加上这两个标签的其它原因如下(还未完全确认):
1. 除了自动注册上述的 RequestMappingHandlerMapping 与 RequestMappingHandlerAdapter 外,它还会自动注册 ExceptionHandlerExceptionResolver
2. 支持使用 ConversionService 进行数据格式转换
3. 支持使用 NumberFormatAnnotation 与 DateTimeFormat 进行数据格式化
4. 支持使用 RequestBody 与 ResponseBody 注解
下一篇将进行源码调试并分析 SpringtMVC 是如何实现并做到上述差异的
SpringtMVC中配置 <mvc:annotation-driven/> 与 <mvc:default-servlet-handler/> 的作用与源码解析的更多相关文章
- Django框架rest_framework中APIView的as_view()源码解析、认证、权限、频率控制
在上篇我们对Django原生View源码进行了局部解析:https://www.cnblogs.com/dongxixi/p/11130976.html 在前后端分离项目中前面我们也提到了各种认证需要 ...
- spring mvc源码解析
1.从DispatcherServlet开始 与很多使用广泛的MVC框架一样,SpringMVC使用的是FrontController模式,所有的设计都围绕DispatcherServlet 为中心来 ...
- Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析
Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...
- spring MVC cors跨域实现源码解析
# spring MVC cors跨域实现源码解析 > 名词解释:跨域资源共享(Cross-Origin Resource Sharing) 简单说就是只要协议.IP.http方法任意一个不同就 ...
- spring MVC cors跨域实现源码解析 CorsConfiguration UrlBasedCorsConfigurationSource
spring MVC cors跨域实现源码解析 spring MVC cors跨域实现源码解析 名词解释:跨域资源共享(Cross-Origin Resource Sharing) 简单说就是只要协议 ...
- Spring MVC工作原理及源码解析(三) HandlerMapping和HandlerAdapter实现原理及源码解析
1.HandlerMapping实现原理及源码解析 在前面讲解Spring MVC工作流程的时候我们说过,前端控制器收到请求后会调⽤处理器映射器(HandlerMapping),处理器映射器根据请求U ...
- springmvc源码解析MvcNamespaceHandler之<mvc:view-resolvers>
说在前面 本次主要介绍springmvc配置解析. springmvc配置解析 本次介绍MvcNamespaceHandler. 进入到这个方法org.springframework.web.serv ...
- 源码解析.Net中IConfiguration配置的实现
前言 关于IConfituration的使用,我觉得大部分人都已经比较熟悉了,如果不熟悉的可以看这里.因为本篇不准备讲IConfiguration都是怎么使用的,但是在源码部分的解读,网上资源相对少一 ...
- Spring5源码解析-Spring框架中的单例和原型bean
Spring5源码解析-Spring框架中的单例和原型bean 最近一直有问我单例和原型bean的一些原理性问题,这里就开一篇来说说的 通过Spring中的依赖注入极大方便了我们的开发.在xml通过& ...
随机推荐
- uva208
一道简单的路径打印,首先需要一次dfs判断能否从1到达目标点,否则可能会超时.还有一点就是那个格式需要注意下,每条路径前没有空格(看起来好像有3个空格)-. AC代码: #include<cst ...
- 王垠:我和Google的故事
也许有人看见过我批判 Google 的那篇英文文章.它好像有一部分片面性,所以被我从英文博客上拿下来了.我一直在反思自己在 Google 的经历,因为在这个公司工作总是感觉不对劲,但是却总也说不清楚为 ...
- hive:排序分析函数
基本排序函数 语法: rank()over([partition by col1] order by col2) dense_rank()over([partition by col1] order ...
- 20 个 CSS 高级技巧汇总
原文:https://segmentfault.com/a/1190000003936841 使用技巧会让人变的越来越懒,没错,我就是想让你变懒.下面是我收集的CSS高级技巧,希望你懒出境界. 1. ...
- 【Unity3D】Unity3D开发《我的世界》之六、创建地形(视频 + 源码)
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_06.html 一.引入LibNoise 虽然Unity3D里也有一个Mathf.P ...
- R+tmcn笔记︱tmcn包的基本内容以及李舰老师R语言大会展示内容摘录
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- tmcn包目前托管在在R-forge 上开发和 ...
- mongodb: Remote server has closed the connection
<?php function getMongoClient($seeds = "", $options = array(), $retry = 3) { try { retu ...
- linux命令--ldconfig和ldd用法
一.ldconfig ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig. ldconfig 命令的用途,主要是在默认搜寻目录(/ ...
- 数据库 事务的特性ACID
数据库 事务的特性ACID 事务(Transaction)是并发控制的基本单位. 所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.例如,银行转帐工作:从一个帐 ...
- 如何开发jQuery插件
一:普及JQuery知识 知识1:用JQuery写插件时,最核心的方法有如下两个: $.extend(object) 可以理解为,为JQuery 类添加一个静态方法. $.fn.extend(obje ...