1. 参考图片
  2.   

    综上所述我们来猜测一下spring mvc 中根据URL找到处理器Controller中相应方法的流程

    ①:获取Request的URL

    ②:从UrlLookup这个map中找到相应的requestMappingInfo

    ③:如果没找到则遍历所有requestMappingInfo的信息直到找到匹配的requestMappingInfo

    ④:根据requestMappingInfo到mappingLookup中找到handlerMethod

  3. Spring mvc是如何通过URL查找到对应的处理器controller以及对应的方法尼?需要知道以下3个核心接口handlerMapping,handlerAdapter,RequestCondition我们不具体分析相应接口的实现以及具体逻辑,过程相当复杂,1到2句话说

    不清楚,这里给大家留一个直观的考量。

  4. @RequestMapping来标识访问路径,我们以此模板给大家量化分析url查询处理器controller以及相应方法的过程

    handlerMapping:负责查找URL对应的处理器Controller

    RequestMappingInfo:根据注解@RequestMapping生成方法匹配策略

    handlerAdapter:负责绑定参数,执行请求,处理返回值

    1. handlerMapping 接口就一个方法返回HandlerExecutionChain
    2. HandlerExecutionChain包含hanlder、interrupter
    3. 一个处理器中+内部N个方法== N个Handler
    4. M个处理器=M×N个Handler
    5. M×N个Hanlder存放在handlerMappings中
    6. 在DispatcherServlte的servlet初始化中(调用init()方法)中调用onRefresh()完成handlerMappings的初始化

    7. DispatcherServlte会根据handlerMapping与已经注册好了的HandlerAdapter一一匹配,看哪一种HandlerAdapter是支持该handlerMapping类型的,

      如果找到了其中一种HandlerAdapter是支持传过来的handlerMapping类型,那么该HandlerAdapter会调用自己的handle方法,handle方法运用Java的反射机制执行controller的具体方法来获得ModelAndView

  5. 最后说一下RequestMappingHandlerMapping并不是默认的查找处理器方法的策略,他是通过  <mvc:annotation-driven />配置完成容器注册的

  6. 参考 https://www.cnblogs.com/huxuhong/p/7245690.html
  7. spingmvc 执行流程中请求访问时处理器映射器会返回具体的执行链(就是一条符合映射规则的所有拦截器和映射器的列表,你的请求的处理流程就是围绕着这条执行链走的,列表的最后一个元素就是你的处理器对象,执行顺序:先正向---后反向---再反向,详细的你可以查一下springmvc的拦截器执行流程),所以说我个人认为适配器认为是设计模式上的一种规范,可以简单理解为是用来调用目标方法的。

    handlerMapping有很多种:AbstractDetectingUrlHandlerMapping, AbstractHandlerMapping, AbstractHandlerMethodMapping, AbstractUrlHandlerMapping, BeanNameUrlHandlerMapping, RequestMappingHandlerMapping, RequestMappingInfoHandlerMapping, SimpleUrlHandlerMapping, WebSocketHandlerMapping

    常用的几个: BeanNameUrlHandlerMapping, RequestMappingHandlerMappingSimpleUrlHandlerMapping,当然你不注册,框架也会有默认加载映射器,具体配置在自带的某个配置文件里,可以找到的

    处理器映射器作用:先说个场景,当你在写一个处理器的时候,框架提供给你了很多种方式(1.可以通过RequestMappingHandlerMapping使扫描指定目录,使用注解的的方式创建处理器,@Contraller 标记一个处理器,@requestMapping关联url与具体的调用方法。2.你也可以通SimpleUrlHandlerMapping在xml中配置的的方式注册一个处理器,里面写上url与具体的处理器的具体映射关系。3,你还可以通过BeanNameUrlHandlerMapping,将请求的url与BeanNameUrlHandlerMapping的节点的name值加上处理器的name值比对的方式找到具体的某个处理器,。。。。。。),所以面对这些情况,你具体用的哪一种方式核心控制器是不知道的,即使知道它也是处理不了的(因为它没有处理这些情况的代码功能)这时就需要你告诉他了,假如当你在springmvc.xml中注册了一个映射器,例如注解的映射器,当框架加载xml生成子容器的时候,发现这个映射器的时候框架就会明白原来你在项目中用了注解,它就会调用扫描器去扫描你告诉它的目录地址,将注解解析成对象放到容器中,同时保存url与具体的方法的映射关系。假如你注册的是BeanNameUrlHandlerMapping它就知道该去配置文件中去解析你的处理器,并使用拼接的方式保存与url进行匹对的规则。。。。。。。。

    至于适配器本质上其实就是一接口,主要作用就是提供框架调用你的具体的处理器和传递数据用的,跟设计模式里的适配器的作用是一个道理(但又不完全相同,因为只要你能自定义方法名,就说明不是简单的通过接口方法直接调用目标类方法的,应该是反射方式实现的)。因为在框架中是不可能写死的,简单的认为通过接口调用你的实现类中的方法(注解除外,注解大概应该是通过方法对象的反射实现的);

  8. 参考 https://q.cnblogs.com/q/107148/

Spring MVC 梳理 - handlerMapping和handlerAdapter分析的更多相关文章

  1. Spring mvc之源码 handlerMapping和handlerAdapter分析

    Spring mvc之源码 handlerMapping和handlerAdapter分析 本篇并不是具体分析Spring mvc,所以好多细节都是一笔带过,主要是带大家梳理一下整个Spring mv ...

  2. Spring MVC的handlermapping之SimpleUrlHandlerMapping初始化

    前面信息同BeanNameUrlHandlerMapping,这里不再过多分析,详情请看 :Spring MVC的handlermapping之BeanNameUrlHandlerMapping初始化 ...

  3. Spring MVC 梳理 - 四种HandlerMapping

    总结 (1)SpringMVC导入jar包,配置web.xml 这些都是基础的操作. (2)四种HandlerMapping:DefaultAnnotationHandlerMapping;Simpl ...

  4. spring mvc 自定义Handlermapping

    上次大概写了个可以解决velocity 多视图的东西. 但是实际运用过程中又到处找了些资料看了下.这里 小计下: DispatcherServlet解析过程: ..1..HandlerMapping. ...

  5. Spring MVC的handlermapping之请求分发如何找到正确的Handler(BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping)

    本文讲的是Spring MVC如何找到正确的handler, 前面请求具体怎么进入到下面的方法,不再细说. 大概就是Spring mvc通过servlet拦截请求,实现doService方法,然后进入 ...

  6. Spring MVC:HandlerMapping

    HandlerMapping 的类图 Spring中存在两种类型的handlers.第一种是 handler mappings(处理程序映射).它们的角色定位与前面所描述的功能完全相同.它们尝试将当前 ...

  7. Spring MVC 框架的架包分析,功能作用,优点

    由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关j ...

  8. spring mvc(4) HandlerMapping

    在前面一节里提到,DispatcherServlet在接收到请求后,通过HandlerMapping找到处理请求对应的Controller(其实处理请求器并不一定是Controller,还可以是Htt ...

  9. Spring MVC的handlermapping之BeanNameUrlHandlerMapping初始化

    先介绍一下: BeanNameUrlHandlerMapping是基于配置文件的方式; 所有处理器需要在XML文件中,以Bean的形式配置. 缺点:配置繁琐; 如果多个URL对应同一个处理器,那么需要 ...

随机推荐

  1. HTTP网页异常错误代码详解

    在调试TomCat,等web服务器的时候我们有时候各种错误代码铺面而来,让人头疼不已,那么这些代码究竟都代表什么呢?知道这些代码会会对我们的调试帮助很大 让我们来看一下这些代码究竟什么意思 400 无 ...

  2. runnable和thread实现多线程的区别

    下面以典型的买票程序(基本都是以这个为例子)为例,来说明二者的区别. 首先通过继承Thread类实现,代码如下: class MyThread extends Thread{ private int ...

  3. This probably means that Tcl wasn't installed properly.

    报错 D:/Anaconda3/tcl/tcl8.6/init.tcl: version conflict for package "Tcl": have 8.6.8, need ...

  4. fiddler的安装与使用(二)使用fiddler捕获会话信息

    前章回顾: 上一遍文章我们已经安装好了fiddler,并解了fiddler的工作原理,接下来开始使用fiddler捕获浏览器会话信息. fiddler基本界面: 首先启动fiddler,然后打开浏览器 ...

  5. codeforces 821 D. Okabe and City(最短路)

    题目链接:http://codeforces.com/contest/821/problem/D 题意:n*m地图,有k个位置是点亮的,有4个移动方向,每次可以移动到相邻的点亮位置,每次站在初始被点亮 ...

  6. mariadb 远程访问报:Host xxx is not allowed to connect to this MariaDb server

    刚开始试的是: 结果报错了,哎,这折腾的. 继续折腾,加个密码试试: 再用Navicat试试,果然成功了.

  7. 15 个有用的 MySQL/MariaDB 性能调整和优化技巧

    MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS).它发布于 1995 年(20年前).它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择.最新的 MySQL 版本是 ...

  8. JavaScript数组和伪数组

    伪数组和数组 记住一句话: 伪数组是一个Object,数组是Array. 对象和数组之间的关系 JavaScript的内置函数继承与 Object.prototype. 可以认为new Array() ...

  9. 弄懂goroutine调度原理

    goroutine简介 golang语言作者Rob Pike说,"Goroutine是一个与其他goroutines 并发运行在同一地址空间的Go函数或方法.一个运行的程序由一个或更多个go ...

  10. Scrapy框架的下载与安装

    一.下载scrapy 首先,如果安装了anaconda, 可以直接在terminal窗口中输入: conda install scrapy 在图示符中,输入y, 表示继续处理信息 二.验证 是否安装成 ...