基于 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. nyoj234 吃土豆 01背包

    思路:假设我们先只考虑一行,规则就是取了i处的土豆,每一个土豆有两种选择,拿与不拿,那么i-1和i+1处的土豆都不能再取,那么要求某一行的最大取值就用一次动态规划即可,dp(i)表示前i个土豆能取得的 ...

  2. html标签详解

    html标签详解   <!DOCTYPE> 标签 <!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. <!DOCTYPE ...

  3. Luogu P1522 牛的旅行 Cow Tours

    题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...

  4. Ubuntu上搭建Hadoop环境(单机模式+伪分布模式)

    首先要了解一下Hadoop的运行模式: 单机模式(standalone)        单机模式是Hadoop的默认模式.当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守地选 ...

  5. MySQL Crash Errcode: 28 - No space left on device

    一台MySQL服务器突然Crash了,检查进程 ps -ef | grep -i mysql 发现mysqld进程已经没有了, 检查错误日志时发现MySQL确实Crash了.具体如下所示: 注意日志中 ...

  6. mysql 查询表死锁 和结束死锁的表步骤

    1.查询是否锁表 show OPEN TABLES ; 2.查询进程 show processlist 查询到相对应的进程===然后 kill    id 3.查看正在锁的事务 SELECT * FR ...

  7. C#抽象类应用实例

    abstract修饰符可以和类.方法.属性.索引器及事件一起使用,在类声明中使用abstract修饰符以表明这个类只能是其他类的基类. 抽象类的特性 (1)抽象类不能被实例化 (2)抽象类可以包含抽象 ...

  8. freemark标签从后台接过来数据Boolean在前台还是Boolean输出(四)

    FREEMARK标签中输出BOOLEAN值 private boolean showHeader=true; public boolean getShowHeader(){ return this.s ...

  9. 【原】Spring源码浅析系列-导入源码到Eclipse

    用了Spring几年,平时也断断续续在项目里看过一些源码,大多都是比较模糊的,因为一旦从一个地方进去就找不到方向了,只能知道它大概是做了什么事能达到这个功能或者效果,至于细节一般没有太深入去研究.后来 ...

  10. java实现中文分词

    IK Analyzer是基于lucene实现的分词开源框架 下载路径:http://so.csdn.net/so/search/s.do?q=IKAnalyzer2012.jar&t=doc& ...