在深入学习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 映射与适配器的更多相关文章

  1. spring mvc 映射器和适配器

    映射器和适配器 1.非注解的映射器和适配器 a. 入门程序中的单个映射 BeanNameUrlHandlerMapping SimpleControllerHandlerAdapter b.另一种ma ...

  2. Spring mvc的基本配置及工作原理

    1.spring mvc框架搭建 需求:在浏览器输入一个请求login.do,跳转到登录成功界面. 第一步,创建web项目,导入jar包 注意: 第二步,在web.xml中配置spring的核心监听器 ...

  3. Spring MVC教程——检视阅读

    Spring MVC教程--检视阅读 参考 Spring MVC教程--一点--蓝本 Spring MVC教程--c语言中午网--3.0版本太老了 Spring MVC教程--易百--4.0版本不是通 ...

  4. 零基础搭建 spring mvc 4 项目(本文基于 Servlet 3.0)

    作者各必备工具的版本如下: Tomcat:apache-tomcat-7.0.63 (下载链接) Java EE - Eclipse:Luna Service Release 1 v4.4.1 (下载 ...

  5. spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器)

    spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器) 资源绑定视图解析器 + 内部资源(普通模式)视图解析器 并存方式 内部资源视图解析器: http:// ...

  6. Spring MVC:控制器类名称处理映射

    控制器类名称处理映射的好好处是: 如果项目是hello,WelcomeController是控制器,那么访问地址是: http://localhost:8080/hello/welcome http: ...

  7. spring:设置映射访问路径 或 xml配置访问路径 (spring mvc form表单)

    项目hello, 在src/main/java下面建一个目录: charpter2 一.xml配置访问路径 web.xml <web-app> <display-name>Ar ...

  8. Spring MVC 基于URL的映射规则(注解版)

    好几天没有跟进Spring MVC的学习了,之前看了点源码都忘的差不多了.这次就跟着之前的问题,继续总结下Spring MVC中的小知识. 关于SpringMVC的小demo可以参考这里! url-p ...

  9. Spring MVC的映射请求

    一.SpringMVC常用注解 @Controller 声明Action组件 @Service    声明Service组件    @Service("myMovieLister" ...

随机推荐

  1. eclipse--常见问题

    学习java的都知道这个编辑器,但这个编辑器的有很多功能很多人不知道怎么用,我系统的整理一下我学习过程中遇到的过的问题 1.eclipse如何导入external jar包?        参考:ht ...

  2. Windows下虚拟机安装Mac OS X —– VMware Workstation12安装Mac OS X 10.11

    1下载  镜像:Instal OS X Yosemite 10.10.3(14D131).cdr        密码:qhhm 2 unlocker208文件(链接:https://pan.baidu ...

  3. linux centos 中访问linux 共享文件方法

    mount -t cifs -o username="administrator",password="" //192.168.1.101/cp /mnt/nt ...

  4. html5 video标签屏蔽右键视频另存为的js代码-HTML5教程

    点评:html5 video标签本身有下载功能但是在video区域内,点击右键可以将“视频另存为”下面是屏蔽右键视频另存为的js代码,有此需求的朋友不要错过   做HTML5的video标签,本身我们 ...

  5. java异常处理——finally相关

    示例程序1 public class EmbededFinally { public static void main(String args[]) { int result; try { Syste ...

  6. redis哨兵架构的基础知识及部署和管理

    一.前言 1.哨兵的介绍 sentinal,中文名是哨兵 哨兵是redis集群架构中非常重要的一个组件,主要功能如下 ()集群监控,负责监控redis master和slave进程是否正常工作 ()消 ...

  7. bootstrap-treeview 如何实现全选父节点下所有子节点及反选

    转(https://www.augsky.com/992.html) 选中父节点时,父节点下所有子节点也都全部选中 1,HTML代码 <h2>TreeView Checkable</ ...

  8. Why the Anaconda command prompt is the first choice in windows?

    为什么在windows里,首选的conda命令行工具是Anaconda command prompt? In windows, what's the difference between comman ...

  9. NFS服务器工作原理

    一.NFS简介 NFS是Network File System的缩写,中文称为网络文件系统,它的主要功能是通过网络(一个局域网)让不同的主机系统之间可以共享文件或目录,NFS的客户端(一般为应用服务器 ...

  10. (14/24) css进阶:(入门)去除冗余的css

    在平时的项目开发中,我们会引入一些框架,比如:Bootstrap,但是在项目中通常我们只使用它的一小部分,还有部分是冗余的.更有甚有时候需求更改,带来DOM结构的更改,这时候我们可能无暇关注CSS样式 ...