SpringMVC源码学习之request处理流程
目的:为看源码提供调用地图,最长调用逻辑深度为8层,反正我是springMVC源码学习地址看了两周才理出来的。
建议看完后还比较晕的,参照这个简单的模型深入底层,仿SpringMVC自己写框架,再来理解会容易得多
1.处理流程(版本为4.3.18)
入口为spring-webmvc-4.3.18.RELEASE.jar中org.springframework.web.servlet.DispatcherServlet.doService(request,respose)处理session中的flashmap springMVC源码学习之addFlashAttribute源码分析
-->doDispatch(request, response)主要逻辑都在这里,创建modelandview,
----找到mappedHandler = getHandler(processedRequest),得到的mappedHandler包含一个请求的handler处理方法以及与该请求相关的所有拦截器,DispatcherServlet.getHandler方法会在底层调用HandlerMapping.getHandler(实际执行AbstractHandlerMapping.getHandler,调用抽象方法getHandlerInternal,此方法在子类org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapte.getHandlerInternal。中实现)
----HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());在使用@RequestMapping注解标注handler方法的时候,获取到的是HandlerAdapter的
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter实现类的一个对象;DispatcherServlet.getHandlerAdapter()调用 HandlerAdapter的实现抽象类org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.supports()调用supportsInternal()执行org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.supportsInternal(return true)
----mv = ha.handle(processedRequest, response, mappedHandler.getHandler());真正执行请求,最终通过反射调用Method.invoke,
调用HandlerAdapter是一个接口,HandlerAdapter.handle执行org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(request,respose,handler)
调用自己的handleInternal()执行org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal()
调用自己的方法invokeHandlerMethod(),RequestContextUtils.getInputFlashMap(request)可以获取到request中的attribute,且将所有的request中的attribute放置在mavContainer中,modelFactory.initModel()会将@ModelAttribute方法调用一遍,并且将相关的MV放到mavContainer,invokeAndHandle()执行conroller中的方法
调用org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(webRequest, mavContainer, new Object[0])得到returnValue和returnType并
调用父类spring-web-4.3.18.RELEASE.jar中org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(webRequest, mavContainer, providedArgs)
调用自己方法doInvoke(args)
调用父类org.springframework.web.method.HandlerMethod.getBridgedMethod().invoke(getBean(), args)
实际执行java.lang.reflect.Method.invoke(Clazz.newInstance(),inputParam)关于反射调用方法java reflect反射调用方法invoke;
SpringMVC源码学习之request处理流程的更多相关文章
- springMVC源码学习地址
springmvc工作原理以及源码分析(基于spring3.1.0) 感谢作者 宏愿, 在此记录下,以便学习 SpringMVC源码分析(1):分析DispatcherServlet.doDispa ...
- springMvc源码学习之:spirngMvc的参数注入的问题
转载:https://my.oschina.net/lichhao/blog/172562 概述 在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成 ...
- springMVC源码学习之addFlashAttribute源码分析
本文主要从falshMap初始化,存,取,消毁来进行源码分析,springmvc版本4.3.18.关于使用及验证请参考另一篇jsp取addFlashAttribute值深入理解即springMVC发r ...
- springmvc源码学习
1.springmvc运行流程 流程图是直接在百度图片中找的一张 >.前台发送请求,请求会首先通过DispatcherServlet进行url的匹配;如果匹配不到,看是否配置<mvc: ...
- ASP.NET Core MVC 源码学习:MVC 启动流程详解
前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...
- springMVC源码学习之获取参数名
1.入口到参数处理调用流程 入口为spring-webmvc-4.3.18.RELEASE.jar中org.springframework.web.servlet.DispatcherServlet. ...
- SpringMVC源码学习:容器初始化+MVC初始化+请求分发处理+参数解析+返回值解析+视图解析
目录 一.前言 二.初始化 1. 容器初始化 根容器查找的方法 容器创建的方法 加载配置文件信息 2. MVC的初始化 文件上传解析器 区域信息解析器 handler映射信息解析 3. Handler ...
- springMvc源码学习之:spring源码总结
转载自:http://www.cnblogs.com/davidwang456/p/4213652.html spring beans下面有如下源文件包: org.springframework.be ...
- springMvc源码学习之:spirngMVC获取请求参数的方法2
@RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他 (@CookieValue)!她(@ModelAndView ...
随机推荐
- Microsoft.NET.Framework开机报错解决方法
win10自动更新后每次开机都报错Microsoft.NET.Framework. 如下图所示: 网上查了各种各样的方法折腾了好久. 其中看到了这样一个回答 “有两种可能 你电脑里的某个软件需要使用M ...
- 【支付专区】之解析微信支付返回xml
public static Map<String,Object> parseBodyXml2Map(String xml){ Map<String,Object> map = ...
- Hadoop概念学习系列之关于hadoop-2.2.0和hadoop2.6.0的winutils.exe、hadoop.dll版本混用(易出错)(四十三)
问题详情是 2016-12-10 23:24:13,317 INFO [org.apache.hadoop.metrics.jvm.JvmMetrics] - Initializing JVM Met ...
- 统计python文件中的代码,注释,空白对应的行数
其实代码和空白行很好统计,难点是注释行 python中的注释分为以#开头的单行注释 或者以'''开头以'''结尾 或以"""开头以"""结尾 ...
- PAT 乙级 1076 Wifi密码 (15)
下面是微博上流传的一张照片:“各位亲爱的同学们,鉴于大家有时需要使用wifi,又怕耽误亲们的学习,现将wifi密码设置为下列数学题答案:A-1:B-2:C-3:D-4:请同学们自己作答,每两日一换.谢 ...
- Java NIO系列教程(三) Channel之Socket通道
目录: <Java NIO系列教程(二) Channel> <Java NIO系列教程(三) Channel之Socket通道> 在<Java NIO系列教程(二) Ch ...
- Java学习---异常处理
import java.util.Scanner; public class MyExceptionTest { public static void check(Square A) throws W ...
- K近邻(K Nearest Neighbor-KNN)原理讲解及实现
算法原理 K最近邻(k-Nearest Neighbor)算法是比较简单的机器学习算法.它采用测量不同特征值之间的距离方法进行分类.它的思想很简单:如果一个样本在特征空间中的k个最近邻(最相似)的样本 ...
- OSI七层
应用层 应用程序的通信服务 telnet.HTTP.FTP.NFS.SMTP 表示层 定义数据格式和加密 加密.ASCII 会话层 如何开始.控制.结束一个会话,包括多个双向消息的控制和管理,以便在只 ...
- [UE4]HitResult中各项数值的含义
对于“LineTraceByChannel”来说: Blocking Hit:是否击中了物体 Initial Overlap: Time: Distance: Location(击中的位置)等于Imp ...