承接相关之前的SpringMVC的框架技术的流程分析

初始化流程(initStrategies)

执行流程

寻找相关HandlerMapping

请求到DispatcherServlet类进行执行相关的HandlerMapping集合,找到对应类型的HandlerMapping对象的实现类,如果是一般的采用注解(@RequestMapping)注入的实现类(RequestMappingHandlerMapping)类,

HandlerMapping实现类之RequestMappingHandlerMapping对象

找出Spring容器中被@Controller/@RestController注解修饰的bean以及被@RequestMapping注解修饰的类和方法。

HandlerMapping属性的HandlerMethod对象

HandlerMethod是Method以及Parameter的helper class。在HandlerMapping中被构造,

并在HandlerAdapter中被使用。

HandlerExecutionChain对象

当获取到对应的HandlerMapping对象的实现类后,接下来返回到DispatcherServlet类对象,需要构建或者获取相关的HandlerExecutionChain对象,内部包含了很多额外组件,例如:interceptor拦截器。

HandlerAdapter对象

根据HandlerExecutionChain中的Handler,在对应的HandlerAdapter集合找到支持此Handler的HandlerAdapter,调用相关的HandlerMethod对象方法,使用HandlerAdapter得到ModelAndView对象返回到DispatcherServlet。

RequestMappingHandlerAdapter

找到的对应的RequestMapping的HandlerAdapter对象的实现类RequestMappingHandlerAdapter对象操作处理。

HandlerInterceptor拦截器
  • 前置拦截器:HandlerInterceptor-preHandle
  • 后置拦截器:HandlerInterceptor-postHandle
HandlerExceptionResolver异常处理

上面的操作处理方式可能会发生异常,使用HandlerExceptionResolver策略解决。

RequestMappingHandlerAdapter的处理操作

  • HandlerMethodArgumentResolverComposite:该对象处理和包含了内部多个HandlerMethodArgumentResolver集合。

    • HandlerMethodArgumentResolver:解析相关的方法入口参数的解析机制!
  • HandlerMethodReturnValueHandlerComposite:该对象处理和包含了内部多个的HandlerMethodReturnValueHandler集合。
    • HandlerMethodReturnValueHandler:该对象处理和操作方法的返回值

HandlerMethodArgumentResolver参数入口的解析器

RequestParamMethodArgumentResolver

处理@RequestParam注解修饰的参数:HandlerMethodArgumentResolver的实现类之一:RequestParamMethodArgumentResolver

RequestResponseBodyMethodProcessor

处理@RequestBody注解修饰的参数:HandlerMethodArgumentResolver的实现类

HandlerMethodReturnValueHandler参数返回操作解析器

RequestResponseBodyMethodProcessor

处理@ResponseBody注解修饰的返回值:HandlerMethodReturnValueHandler的实现类

ModelAndViewMethodReturnValueHandler

处理返回值类型为ModelAndView对象返回值:HandlerMethodReturnValueHandler的实现类

ViewResolver视图解析器

将ModelAndView的对象数据与数据页面模板进行解析处理操作ViewResolver对象,生成相关的View对象。并且返回相关的response:freemarker, jsp. json, xml等。

HandlerInterceptor的收官处理

最终完成拦截器:afterCompletion方法操作。

🍃【Spring专题】「原理系列」SpringMVC的运行工作原理(补充修订)的更多相关文章

  1. 如何让 Spring Security 「少管闲事」

    记两种让 Spring Security「少管闲事」的方法. 遇到问题 一个应用对外提供 Rest 接口,接口的访问认证通过 Spring Security OAuth2 控制,token 形式为 J ...

  2. Feign 系列(03)Feign 工作原理

    目录 Feign 系列(03)Feign 工作原理 1. Feign 是如何设计的 2. Feign 动态代理 2.1 ReflectiveFeign 构建 2.2 生成代理对象 2.3 Method ...

  3. SpringMVC框架的工作原理

    学习SpringMVC的工作原理,首先有三个要解决的问题: (1)DispathcherServlet框架如何截获特定的HTTP请求,交由SpringMVC处理? (2)位于Web层的Spring容器 ...

  4. 浅谈C++编译原理 ------ C++编译器与链接器工作原理

    原文:https://blog.csdn.net/zyh821351004/article/details/46425823 第一篇:      首先是预编译,这一步可以粗略的认为只做了一件事情,那就 ...

  5. ☕【Java技术指南】「序列化系列」深入挖掘FST快速序列化压缩内存的利器的特性和原理

    FST的概念和定义 FST序列化全称是Fast Serialization Tool,它是对Java序列化的替换实现.既然前文中提到Java序列化的两点严重不足,在FST中得到了较大的改善,FST的特 ...

  6. Android逆向之旅---爆破一款资讯类应用「最右」防抓包策略原理分析

    一.逆向分析 首先感谢王同学提供的样本,因为王同学那天找到我咨询我说有一个应用Fiddler抓包失败,其实对于这类问题,我一般都会这么回答:第一你是否安装Fiddler证书了,他说他安装了.第二你是否 ...

  7. 「分块系列」「洛谷P4168 [Violet]」蒲公英 解题报告

    蒲公英 Description 我们把所有的蒲公英看成一个长度为\(n\)的序列(\(a_1,a_2,...a_n\)),其中\(a_i\)为一个正整数,表示第i棵蒲公英的种类的编号. 每次询问一个区 ...

  8. redis 原理系列之--字符串存储的实现原理(1)

    背景 redis功能强大,几乎已经成了现代大中型服务必备的缓存技术了. 除了十分给力的缓存功能,redis当做消息队列,数据库也有着不错的表现. 我们都知道,redis 有五种数据类型,string, ...

  9. ☕【Java深层系列】「并发编程系列」让我们一起探索一下CyclicBarrier的技术原理和源码分析

    CyclicBarrier和CountDownLatch CyclicBarrier和CountDownLatch 都位于java.util.concurrent这个包下,其工作原理的核心要点: Cy ...

随机推荐

  1. Codeforces 576D - Flights for Regular Customers(bitset 优化广义矩阵乘法)

    题面传送门 题意: 有一张 \(n\) 个点 \(m\) 条边的有向图,你初始在 \(1\) 号点,边上有边权 \(c_i\) 表示只有当你经过至少 \(c_i\) 条边的时候你才能经过第 \(i\) ...

  2. 利用elliipse做相关图

    参考资料:<数据探掘 R语言实战> p65-P68 install.packages("rattle") # 获取实验数据集 install.packages(&quo ...

  3. 45-Letter Combinations of a Phone Number

    Letter Combinations of a Phone Number My Submissions QuestionEditorial Solution Total Accepted: 7855 ...

  4. 为 Rainbond Ingress Controller 设置负载均衡

    Rainbond 作为一款云原生应用管理平台,天生带有引导南北向网络流量的分布式网关 rbd-gateway.rbd-gateway 组件,实际上是好雨科技团队开发的一种 Ingress Contro ...

  5. 一起手写吧!Promise!

    1.Promise 的声明 首先呢,promise肯定是一个类,我们就用class来声明. 由于new Promise((resolve, reject)=>{}),所以传入一个参数(函数),秘 ...

  6. C++之无子数

    题目如下: 1 #include <iostream> 2 3 using namespace std; 4 5 6 bool isThisNumhaveChild(int num); 7 ...

  7. 转 Android Lifecycle、ViewModel和LiveData

    转自:https://www.jianshu.com/p/982545e01d0a 1.概述 在I / O '17的时候,其中一个重要的主题是Architecture Components.这是一个官 ...

  8. EasyExcel读写Excel

    使用过 poi 的开发同学可能都有此体会,每次都要写一坨代码,最后的代码如下面一样: 这样的代码是不是又臭又长?当字段数量多的时候,一不小心还容易写错.阿粉还记得当初使用 poi 导出一个二十多字段的 ...

  9. Type difference of character literals in C and C++

    Every literal (constant) in C/C++ will have a type information associated with it. In both C and C++ ...

  10. VUE页面实现加载外部HTML方法

    前后端分离,后端提供了接口.但有一部分数据,比较产品说明文件,是存在其他的服务器上的.所以,在页面显示的时候,如果以页面内嵌的形式显示这个说明文件.需要搞点事情以达到想要的效果.本文主要和大家介绍VU ...