spring mvc 映射与适配器
在深入学习Spring mvc 过程中,我们需要了解如下两个类:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
RequestMappingHandlerMapping 是处理url method关系映射的,直白的说这个类里面维护着一个urlMap 存放着url路径与requestMappingInfo 的信息,通过这个映射就可以快速的找到执行的方法;
RequestMappingHandlerAdapter 是适配器,是用来执行RequestMappingHandlerMapping 映射的方法,里面定义了一些参数解析器等比如模型封装,@RequestParam 的解析等;
接下来就是具体分析这两个类:从以下三点进行展开:
1.这两个类在哪里被加载进来的
2.RequestMappingHanderMapping urlMap 如何装配的
3.RequestMappingHandlerAdapter 参数解析器如何装配;
1. 问题抛出:RequestMappingHanderMapping RequestMappingHandlerAdapter是什么时候加载到Sppring Bean 容器中的?
答:
得益于我们在x m l中配置的 <mvc:annotation-driven/> 标签
在spring 强大的扩展机制下,Spring webmvc包 org.springframework.web.servlet.config.MvcNamespaceHandler类
org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser 类有对该标签的定义与解析如下:

我们看解析parse方法 做了什么事情:
在spring 容器中注册RequestMappingHandlerMapping

在Spring容器中注册RequestMappingHandlerAdapter

好了,其实还注册了其他的类,这里我们就截图这两个;
到这里就很明朗了,这两个类被注册到了Spring be an 工厂了,那么在Spring 最后会进行全部的实例化;
2.问题抛出:RequestMappingHanderMapping urlMap 如何装配的;
答:
在第一个问题中,我们知道了,RequestMappingHanderMapping 被装载进入了Spring bean 容器中,最终会被实例化;那么我们看一看,它实例化做了什么事情;
自下而上看一下它的类结构图:

可知,它实现了InitializingBean接口,其方法 afterPropertiesSet() 会在初始化的时候被调用;看一下

会触发initHandlerMethods() 方法,去寻找处理的方法:我们继续往下点:

这个方法就是会到spring 容器中找到所有的be an 然后在be an 中找到需要的handler 方法;主要是isHandler(...)这个方法的判段:
它会 判断我们的bean 是否有Controller 注解或者RequestMapping 注解,带有这种注解的be an 才会被留下来,进行下一步的操作;

找到匹配的Handler 之后,就进行检测Handler 方法: detectHandlerMethods(beanName);

扫描到所有匹配的方法,具体的方法,参数,注解信息,全部放入 RequestMappingInfo中;

执行 getMappingForMethod 获取到RequestMapping 信息以及方法信息并生成RequestMappingInfo 对象进行封装

然后注册HandlerMethod:

参数-requestInfoMapping 映射放入urlMap 中

这样在初始化的过程中所有的url 映射都已经装配进入内存中了;
3. 问题抛出: RequestMappingHandlerAdapter 参数解析器如何装配:
答:
我们看一下org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter 类它也实现了 InitializingBean接口

getDefaultArgumentResolvers()得到默认的参数解析器:
@RequestBody @ModelAttribute
@RequestParam @CookieValue @RequestHeader
原始数据解析,模型pojo解析 都会被加载进内存

getDefaultInitBinderArgumentResolvers()默认的绑定参数解析:
像@Value @PathVariable等常用的注解解析器就会被加载进来;

以上这两种都属于参数解析器,会加入到 argumentResolvers链表中


getDefaultReturnValueHandlers();默认的返回参数解析器 比如@ResponseBody
最终会被加载 returnValueHandlers 链表中

这样参数解析器就装配好了
spring mvc 映射与适配器的更多相关文章
- spring mvc 映射器和适配器
映射器和适配器 1.非注解的映射器和适配器 a. 入门程序中的单个映射 BeanNameUrlHandlerMapping SimpleControllerHandlerAdapter b.另一种ma ...
- Spring mvc的基本配置及工作原理
1.spring mvc框架搭建 需求:在浏览器输入一个请求login.do,跳转到登录成功界面. 第一步,创建web项目,导入jar包 注意: 第二步,在web.xml中配置spring的核心监听器 ...
- Spring MVC教程——检视阅读
Spring MVC教程--检视阅读 参考 Spring MVC教程--一点--蓝本 Spring MVC教程--c语言中午网--3.0版本太老了 Spring MVC教程--易百--4.0版本不是通 ...
- 零基础搭建 spring mvc 4 项目(本文基于 Servlet 3.0)
作者各必备工具的版本如下: Tomcat:apache-tomcat-7.0.63 (下载链接) Java EE - Eclipse:Luna Service Release 1 v4.4.1 (下载 ...
- spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器)
spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器) 资源绑定视图解析器 + 内部资源(普通模式)视图解析器 并存方式 内部资源视图解析器: http:// ...
- Spring MVC:控制器类名称处理映射
控制器类名称处理映射的好好处是: 如果项目是hello,WelcomeController是控制器,那么访问地址是: http://localhost:8080/hello/welcome http: ...
- spring:设置映射访问路径 或 xml配置访问路径 (spring mvc form表单)
项目hello, 在src/main/java下面建一个目录: charpter2 一.xml配置访问路径 web.xml <web-app> <display-name>Ar ...
- Spring MVC 基于URL的映射规则(注解版)
好几天没有跟进Spring MVC的学习了,之前看了点源码都忘的差不多了.这次就跟着之前的问题,继续总结下Spring MVC中的小知识. 关于SpringMVC的小demo可以参考这里! url-p ...
- Spring MVC的映射请求
一.SpringMVC常用注解 @Controller 声明Action组件 @Service 声明Service组件 @Service("myMovieLister" ...
随机推荐
- 离线手动部署docker镜像仓库——harbor仓库(HTTPS)
实验环境: harbor服务器系统:CentOS Linux release 7.5.1804 (Core)harbor服务器IP:10.1.12.114harbor版本:v1.5.0docker版本 ...
- Docker容器开机自动启动
部署项目服务器时,为了应对停电等情况影响正常web项目的访问,会把Docker容器设置为开机自动启动. 在使用docker run启动容器时,使用--restart参数来设置: # docker r ...
- sass 和less 分别在循环 和超出省略方面的区别!
这两天在迁项目,新项目支持less预处理器,之前是采用的sass,就出现一些冲突,好在有对应的转换方式,重点说下 我遇到的2个问题 1:超出省略 sass: 声明: 在需要的地方: less: 在使用 ...
- Java高级框架——Mybatis(二)
十.三种查询方式 1. selectList()返回值为List<resultType属性控制> 1.1 适用于查询结果都需要遍历的需求 List<Flower> list = ...
- eclipse详细安装教程与环境变量设置
地址:https://blog.csdn.net/q651742112/article/details/73477400 源地址:https://www.cnblogs.com/yeminglong/ ...
- (Python基础)集合操作
集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 以下代码演示了去重,增删改查,以及关系测试供参考学习 ...
- java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider.<init>()
这个问题好奇怪, 出现这个错误是通用Mapper初始化的错误,排查的方向就是往这个方向,可能的情况有以下几种: .jar包冲突 <dependency> <groupId>tk ...
- java异常——五个关键字(try、catch、finally、throw、throws)
一.try.catch.finally常用组合 try{ xxx }catch(xxxException e){ e.printStackTrace(); } try{ xxx }catch(xxxE ...
- 很不幸,装win10和Ubuntu双系统还是入坑了
具体问题描述:在安装Ubuntu的时候,没有发现有与windows共存的提示,直接说本计算机没有安装系统.在安装完成后,发现通过BIOS只有进入Ubuntu的启动项,没有进入Windows的启动项. ...
- [转]MTK6252 11B添加模块、task实例
原网址 http://blog.sina.com.cn/s/blog_6b2328a201014l26.html ###############模块的添加################## 1 ...
