基于 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/> 的作用与源码解析的更多相关文章

  1. Django框架rest_framework中APIView的as_view()源码解析、认证、权限、频率控制

    在上篇我们对Django原生View源码进行了局部解析:https://www.cnblogs.com/dongxixi/p/11130976.html 在前后端分离项目中前面我们也提到了各种认证需要 ...

  2. spring mvc源码解析

    1.从DispatcherServlet开始 与很多使用广泛的MVC框架一样,SpringMVC使用的是FrontController模式,所有的设计都围绕DispatcherServlet 为中心来 ...

  3. Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析

    Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...

  4. spring MVC cors跨域实现源码解析

    # spring MVC cors跨域实现源码解析 > 名词解释:跨域资源共享(Cross-Origin Resource Sharing) 简单说就是只要协议.IP.http方法任意一个不同就 ...

  5. spring MVC cors跨域实现源码解析 CorsConfiguration UrlBasedCorsConfigurationSource

    spring MVC cors跨域实现源码解析 spring MVC cors跨域实现源码解析 名词解释:跨域资源共享(Cross-Origin Resource Sharing) 简单说就是只要协议 ...

  6. Spring MVC工作原理及源码解析(三) HandlerMapping和HandlerAdapter实现原理及源码解析

    1.HandlerMapping实现原理及源码解析 在前面讲解Spring MVC工作流程的时候我们说过,前端控制器收到请求后会调⽤处理器映射器(HandlerMapping),处理器映射器根据请求U ...

  7. springmvc源码解析MvcNamespaceHandler之<mvc:view-resolvers>

    说在前面 本次主要介绍springmvc配置解析. springmvc配置解析 本次介绍MvcNamespaceHandler. 进入到这个方法org.springframework.web.serv ...

  8. 源码解析.Net中IConfiguration配置的实现

    前言 关于IConfituration的使用,我觉得大部分人都已经比较熟悉了,如果不熟悉的可以看这里.因为本篇不准备讲IConfiguration都是怎么使用的,但是在源码部分的解读,网上资源相对少一 ...

  9. Spring5源码解析-Spring框架中的单例和原型bean

    Spring5源码解析-Spring框架中的单例和原型bean 最近一直有问我单例和原型bean的一些原理性问题,这里就开一篇来说说的 通过Spring中的依赖注入极大方便了我们的开发.在xml通过& ...

随机推荐

  1. javascript中快速求数组的全部元素的相加之和

    js中快速求数组的全部元素的相加之和: var arr = [1,2,3,4,5];var sum = eval(arr.join('+')); console.log(sum); 运行结果: 15

  2. python 下载新的模块

    首先, 进入到python的安装目录 在安装目录下有一个Scripts文件夹. 然后里面有一个pip.exe 文件, 这个文件就是执行安装包的. 执行: pip.exe install django ...

  3. FusionCharts 2D柱状图和折线图的组合图

    1.设计思路 (1)了解组合图的特性以及用法,选用图的类型: (2)设计出两根柱子和两根折线,分开展示. 2.设计步骤 (1)设计页面 Column2DLine.html: <!DOCTYPE ...

  4. 织梦dedecms列表序号从0到1开始的办法 autoindex,itemindex标签

    自增1 arclist            标签下使用 [field:global.autoindex/] 默认从1开始 channel         标签下使用 [field:global.au ...

  5. am335x在ubuntu下使用StarterWare编写裸机程序并在CCS中用Jlink调试

    StarterWare在AM335X上的烧录运行 步骤:1.下载安装StarterWare,我们团购的SK需要02.00.00.07版本.最近外网访问慢,我上传到论坛.2.找一张miniSD卡,不需要 ...

  6. Jqurey 得到url参数 getUrlParam

    Jqurey 得到url参数 getUrlParam <script type="text/javascript"> (function ($) { //扩展方法获取u ...

  7. Initialization error SQL*Net not properly installed

    1.错误描述 2.错误原因 由于我在64位操作系统上安装了32位PL/SQL导致出错,出现兼容性连接问题 3.解决办法 安装一个32位的Oracle客户端,Tools-Preferences-Orac ...

  8. web开发性能优化---UI界面篇

    1.尽量采用div+css布局 DIV+CSS相比较与表格布局的优势: a.代码精简 使用DIV+CSS布局,页面代码精简,这一点对XHTML有所了解的都知道.代码精简所带来的直接好处有两点:一是提高 ...

  9. Django学习-11-请求相关信息

    requests对象是由类创建的 from django.core.handlers.wsgi import WSGIRequest    --> 类 request.environ中封装了请求 ...

  10. AJAX跨域问题总结

    跨域是什么? 首先说下同源,同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同.而跨域就是不同源 ! 能够进行跨域的请求 一般a,img,link[rel=stylesheet], ...