Spring MVC 梳理 - handlerMapping和handlerAdapter分析
- 参考图片
-
综上所述我们来猜测一下spring mvc 中根据URL找到处理器Controller中相应方法的流程
①:获取Request的URL
②:从UrlLookup这个map中找到相应的requestMappingInfo
③:如果没找到则遍历所有requestMappingInfo的信息直到找到匹配的requestMappingInfo
④:根据requestMappingInfo到mappingLookup中找到handlerMethod
Spring mvc是如何通过URL查找到对应的处理器controller以及对应的方法尼?需要知道以下3个核心接口handlerMapping,handlerAdapter,RequestCondition我们不具体分析相应接口的实现以及具体逻辑,过程相当复杂,1到2句话说
不清楚,这里给大家留一个直观的考量。
- @RequestMapping来标识访问路径,我们以此模板给大家量化分析url查询处理器controller以及相应方法的过程
handlerMapping:负责查找URL对应的处理器Controller
RequestMappingInfo:根据注解@RequestMapping生成方法匹配策略
handlerAdapter:负责绑定参数,执行请求,处理返回值
- handlerMapping 接口就一个方法返回HandlerExecutionChain
- HandlerExecutionChain包含hanlder、interrupter
- 一个处理器中+内部N个方法== N个Handler
- M个处理器=M×N个Handler
- M×N个Hanlder存放在handlerMappings中
在DispatcherServlte的servlet初始化中(调用init()方法)中调用onRefresh()完成handlerMappings的初始化
DispatcherServlte会根据handlerMapping与已经注册好了的HandlerAdapter一一匹配,看哪一种HandlerAdapter是支持该handlerMapping类型的,
如果找到了其中一种HandlerAdapter是支持传过来的handlerMapping类型,那么该HandlerAdapter会调用自己的handle方法,handle方法运用Java的反射机制执行controller的具体方法来获得ModelAndView
最后说一下RequestMappingHandlerMapping并不是默认的查找处理器方法的策略,他是通过 <mvc:annotation-driven />配置完成容器注册的
- 参考 https://www.cnblogs.com/huxuhong/p/7245690.html
spingmvc 执行流程中请求访问时处理器映射器会返回具体的执行链(就是一条符合映射规则的所有拦截器和映射器的列表,你的请求的处理流程就是围绕着这条执行链走的,列表的最后一个元素就是你的处理器对象,执行顺序:先正向---后反向---再反向,详细的你可以查一下springmvc的拦截器执行流程),所以说我个人认为适配器认为是设计模式上的一种规范,可以简单理解为是用来调用目标方法的。
handlerMapping有很多种:AbstractDetectingUrlHandlerMapping, AbstractHandlerMapping, AbstractHandlerMethodMapping, AbstractUrlHandlerMapping, BeanNameUrlHandlerMapping, RequestMappingHandlerMapping, RequestMappingInfoHandlerMapping, SimpleUrlHandlerMapping, WebSocketHandlerMapping
常用的几个: BeanNameUrlHandlerMapping, RequestMappingHandlerMapping, SimpleUrlHandlerMapping,当然你不注册,框架也会有默认加载映射器,具体配置在自带的某个配置文件里,可以找到的
处理器映射器作用:先说个场景,当你在写一个处理器的时候,框架提供给你了很多种方式(1.可以通过RequestMappingHandlerMapping使扫描指定目录,使用注解的的方式创建处理器,@Contraller 标记一个处理器,@requestMapping关联url与具体的调用方法。2.你也可以通SimpleUrlHandlerMapping在xml中配置的的方式注册一个处理器,里面写上url与具体的处理器的具体映射关系。3,你还可以通过BeanNameUrlHandlerMapping,将请求的url与BeanNameUrlHandlerMapping的节点的name值加上处理器的name值比对的方式找到具体的某个处理器,。。。。。。),所以面对这些情况,你具体用的哪一种方式核心控制器是不知道的,即使知道它也是处理不了的(因为它没有处理这些情况的代码功能)这时就需要你告诉他了,假如当你在springmvc.xml中注册了一个映射器,例如注解的映射器,当框架加载xml生成子容器的时候,发现这个映射器的时候框架就会明白原来你在项目中用了注解,它就会调用扫描器去扫描你告诉它的目录地址,将注解解析成对象放到容器中,同时保存url与具体的方法的映射关系。假如你注册的是BeanNameUrlHandlerMapping它就知道该去配置文件中去解析你的处理器,并使用拼接的方式保存与url进行匹对的规则。。。。。。。。
至于适配器本质上其实就是一接口,主要作用就是提供框架调用你的具体的处理器和传递数据用的,跟设计模式里的适配器的作用是一个道理(但又不完全相同,因为只要你能自定义方法名,就说明不是简单的通过接口方法直接调用目标类方法的,应该是反射方式实现的)。因为在框架中是不可能写死的,简单的认为通过接口调用你的实现类中的方法(注解除外,注解大概应该是通过方法对象的反射实现的);
- 参考 https://q.cnblogs.com/q/107148/
Spring MVC 梳理 - handlerMapping和handlerAdapter分析的更多相关文章
- Spring mvc之源码 handlerMapping和handlerAdapter分析
Spring mvc之源码 handlerMapping和handlerAdapter分析 本篇并不是具体分析Spring mvc,所以好多细节都是一笔带过,主要是带大家梳理一下整个Spring mv ...
- Spring MVC的handlermapping之SimpleUrlHandlerMapping初始化
前面信息同BeanNameUrlHandlerMapping,这里不再过多分析,详情请看 :Spring MVC的handlermapping之BeanNameUrlHandlerMapping初始化 ...
- Spring MVC 梳理 - 四种HandlerMapping
总结 (1)SpringMVC导入jar包,配置web.xml 这些都是基础的操作. (2)四种HandlerMapping:DefaultAnnotationHandlerMapping;Simpl ...
- spring mvc 自定义Handlermapping
上次大概写了个可以解决velocity 多视图的东西. 但是实际运用过程中又到处找了些资料看了下.这里 小计下: DispatcherServlet解析过程: ..1..HandlerMapping. ...
- Spring MVC的handlermapping之请求分发如何找到正确的Handler(BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping)
本文讲的是Spring MVC如何找到正确的handler, 前面请求具体怎么进入到下面的方法,不再细说. 大概就是Spring mvc通过servlet拦截请求,实现doService方法,然后进入 ...
- Spring MVC:HandlerMapping
HandlerMapping 的类图 Spring中存在两种类型的handlers.第一种是 handler mappings(处理程序映射).它们的角色定位与前面所描述的功能完全相同.它们尝试将当前 ...
- Spring MVC 框架的架包分析,功能作用,优点
由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关j ...
- spring mvc(4) HandlerMapping
在前面一节里提到,DispatcherServlet在接收到请求后,通过HandlerMapping找到处理请求对应的Controller(其实处理请求器并不一定是Controller,还可以是Htt ...
- Spring MVC的handlermapping之BeanNameUrlHandlerMapping初始化
先介绍一下: BeanNameUrlHandlerMapping是基于配置文件的方式; 所有处理器需要在XML文件中,以Bean的形式配置. 缺点:配置繁琐; 如果多个URL对应同一个处理器,那么需要 ...
随机推荐
- emlog博客的安装教程
简介 emlog 是一款基于PHP和MySQL的功能强大的博客及CMS建站系统.致力于为您提供快速.稳定,且在使用上又极其简单.舒适的内容创作及站点搭建服务. 安装步骤 1.将src文件夹下的所有文件 ...
- redis 原理系列之--字符串存储的实现原理(1)
背景 redis功能强大,几乎已经成了现代大中型服务必备的缓存技术了. 除了十分给力的缓存功能,redis当做消息队列,数据库也有着不错的表现. 我们都知道,redis 有五种数据类型,string, ...
- C#开发BIMFACE系列18 服务端API之获取模型数据3:获取构件属性
系列目录 [已更新最新开发文章,点击查看详细] 本篇主要介绍如何获取单文件/模型下单个构建的属性信息. 请求地址:GET https://api.bimface.com/data/v2/fil ...
- win8调出右侧菜单栏
1.快捷键:win+c 2.鼠标放在右下角1s
- 【JavaScript】ESlint & Prettier & Flow组合,得此三神助,混沌归太清
Flow Flow的意义 Flow是faceBook开源的一个JavaScript静态类型检查工具,作用类似TypeScript,但是它不像TS那样是一门独立的语言,而是作为一个babel-plugi ...
- poj1037 [CEOI 2002]A decorative fence 题解
---恢复内容开始--- 题意: t组数据,每组数据给出n个木棒,长度由1到n,除了两端的木棒外,每一根木棒,要么比它左右的两根都长,要么比它左右的两根都短.即要求构成的排列为波浪型.对符合要求的排列 ...
- 前端利器躬行记(4)——webpack进阶
webpack是一个非常强大的工具,除了前文所介绍的基础概念之外,还有各种进阶应用,例如Source Map.模块热替换.集成等,本文会对这些内容做依次讲解. 一. runtime和manifest ...
- 使用Kubectl部署应用
目录 使用Kubectl部署应用 Kubectl部署流程 部署一个简单的Demo网站 一旦运行了Kubernetes集群,就可以在其上部署容器化应用程序.因此在开始之前,我们需要先确保集群已经准 ...
- docker容器内 java应用程序启动慢
原谅我对JVM 不是很熟悉. 参考http://hongjiang.info/tomcat-startup-slowly-in-docker/ 感谢作者.
- Spring boot拦截器的实现
Spring boot拦截器的实现 Spring boot自带HandlerInterceptor,可通过继承它来实现拦截功能,其的功能跟过滤器类似,但是提供更精细的的控制能力. 1.注册拦截器 @C ...