SpringtMVC中配置 与 的作用与源码解析

基于 Spring4.X 来学习 SpringtMVC, 在学习过程中,被“告知”在 XML 配置文件中建议设置如下两项:

SpringtMVC中配置 与 的作用与源码解析

一直不明白为什么,但又甘心。于是,花了一点时间来调试源码,想了解清楚为什么需要这样做。

 

 

Demo代码地址:

 

https://github.com/cyhbyw/springMVC_atguigu_TongGang

 

工程名称:

 

springMVC_DebugSourceCode

 

现在开始调试。

情况一:有这两个标签时

1. 初始化 HandlerMapping 的过程如下,且其中包含 RequestMappingHandlerMapping!如下图所示。

SpringtMVC中配置 与 的作用与源码解析

 

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

 

SpringtMVC中配置 与 的作用与源码解析

 

 情况二:没有这两个标签 (提醒:调试时需要注释掉这两个标签的内容

1. 初始化 HandlerMapping 的过程如下,且其中包含 DefaultAnnotationHandlerMapping。如下图所示。

从源码中可以看到,它调用了Line588的 getDefaultStrategies() 方法。而有这两个标签时,调用的是Line570的方法。

 

SpringtMVC中配置 与 的作用与源码解析

 

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

从源码中可以看到,它调用了Line626的 getDefaultStrategies() 方法。而有这两个标签时,调用的是Line608的方法。

 

SpringtMVC中配置 与 的作用与源码解析

可以看到,当有、无这两个标签时,SpringtMVC所采用的HandlerMapping、HandlerAdapter是不一样的。对比如下:

    有这两个标签时   没有这两个标签时  
HandlerMapping    

BeanNameUrlHandlerMapping

SimpleUrlHandlerMapping

RequestMappingHandlerMapping

   

BeanNameUrlHandlerMapping

DefaultAnnotationHandlerMapping

 
HandlerAdapter    

HttpRequestHandlerAdapter

SimpleControllerHandlerAdapter

RequestMappingHandlerAdapter

   

HttpRequestHandlerAdapter

SimpleControllerHandlerAdapter

AnnotationMethodHandlerAdapter

 

 从表中可以看出:

1. 对于HandlerMapping,有标签时比无标签时多出一个 SimpleUrlHandlerMapping。更重要的是,将 DefaultAnnotationHandlerMapping 更新为 RequestMappingHandlerMapping!而从源码中也可以看到,前者已被废弃并建议使用后者。

SpringtMVC中配置 与 的作用与源码解析

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

 

SpringtMVC中配置 与 的作用与源码解析

不知道会不会是因为上述原因才建议加上这两个标签的,但是,总归来说,使用已过时被废弃的类总是不好的吧。所以,即使没有其它更多理由,还是遵循建议,加上这两个标签吧。

自己还知道的建议加上这两个标签的其它原因如下(还未完全确认):

1. 除了自动注册上述的 RequestMappingHandlerMapping 与 RequestMappingHandlerAdapter 外,它还会自动注册 ExceptionHandlerExceptionResolver

2. 支持使用 ConversionService 进行数据格式转换

3. 支持使用 NumberFormatAnnotation 与 DateTimeFormat 进行数据格式化

4. 支持使用 RequestBody 与 ResponseBody 注解

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzgpd.html