Spring MVC 梳理 - handlerMapping和handlerAdapter分析

  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/

原文地址:https://www.cnblogs.com/jiangtao1218/p/10263696.html

时间: 2024-10-10 19:26:59

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

Spring mvc之源码 handlerMapping和handlerAdapter分析

Spring mvc之源码 handlerMapping和handlerAdapter分析 本篇并不是具体分析Spring mvc,所以好多细节都是一笔带过,主要是带大家梳理一下整个Spring mvc的执行流程,以及如何根据URL查找处理器Controller的实现 (适合那些刚阅读源码不知道如何下手的人) http://www.guojinbao.com/borrow/borrowDetail/GETadLPjnf0[d].do 如何根据URL地址---->找到正确处理器Controller

Spring MVC:handlermapping

HandlerMapping 首先这是一个接口,也就是可扩展.它的作用就是根据不同的请求去匹配对应的Handler,也就是根据请求匹配一个请求处理器.这个过程需要两个步骤:第一步,需要将Handler注册到HandlerMapping中:第二步,分析请求根据规则从已注册的Handler中匹配到对应的Handler,即Controller.默认情况下,SpringMvc为我们提供了几个默认的HandlerMapping的实现,通过优先级的次序决定执行的顺序. HandlerMapping执行顺序

Spring学习总结(2.3)-Spring MVC:handlermapping

上篇博客讲了DispathcerServlet的流转过程以及它是如何工作的,从这篇博客开始就开始深入到DispatcherServlet的内部看看它的几个主要的组件.那么这一篇就从HandlerMapping这个组件开始学习. HandlerMapping 首先这是一个接口,也就是可扩展.它的作用就是根据不同的请求去匹配对应的Handler,也就是根据请求匹配一个请求处理器.这个过程需要两个步骤:第一步,需要将Handler注册到HandlerMapping中:第二步,分析请求根据规则从已注册的

Spring MVC之HandlerMapping初始化

Spring MVC的Control主要由HandlerMapping和HandlerAdapter两个组件提供. HandlerMapping负责映射用户的URL和对应的处理类,HandlerMapping并没有规定这个URL与应用的处理类如何映射,在HandlerMapping接口中只定义了根据一个URL必须返回一个由HandlerExecutionChain代表的处理链,我们可以在这个处理链中添加任意的HandlerAdapter实例来处理这个URL的对应的请求. HandlerMappi

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

由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关jar的作用.关系.这篇文章总结一下spring框架的相关知识. 一.spirng的简介(高手可以跳过) Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的

Spring MVC初始化部分源码分析

首先定位到org.springframework.context.support.AbstractApplicationContext中的refresh()方法: public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh

spring mvc 3.2源码分析

1,httpServlet public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { HttpServletRequest request; HttpServletResponse response; try { request = (HttpServletRequest) req; response = (HttpServletResponse) res

Spring MVC的handlermapping之BeanNameUrlHandlerMapping初始化

先介绍一下: BeanNameUrlHandlerMapping是基于配置文件的方式; 所有处理器需要在XML文件中,以Bean的形式配置. 缺点:配置繁琐; 如果多个URL对应同一个处理器,那么需要配置多条,同时也会实例化多个对象等等... 因为springmvc 是基于spring的,所以他的初始化肯定是在spring容器初始化之后才进行的. 先上类图: 可以看到BeanNameUrlHandlerMapping父类最终实现了ApplicationContextAware接口,所以Sprin

Spring MVC的handlermapping之RequestMappingHandlerMapping初始化

RequestMappingHandlerMapping:这个handlerMapping是基于注解的同样,先上类图: 通过类图可以看到,同样是继承父类 AbstractHandlerMapping来进行拦截器的初始化工作,实际上处理自己逻辑的只有下面三个类;需要注意的是RequestMappingHandlerMapping初始化并不是重写initApplicationContext()方法 ,而是通过实现InitializingBean接口来进行初始工作的. 备注:InitializingB