目的:为看源码提供调用地图,最长调用逻辑深度为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处理流程的更多相关文章

  1. springMVC源码学习地址

    springmvc工作原理以及源码分析(基于spring3.1.0) 感谢作者  宏愿, 在此记录下,以便学习 SpringMVC源码分析(1):分析DispatcherServlet.doDispa ...

  2. springMvc源码学习之:spirngMvc的参数注入的问题

    转载:https://my.oschina.net/lichhao/blog/172562 概述 在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成 ...

  3. springMVC源码学习之addFlashAttribute源码分析

    本文主要从falshMap初始化,存,取,消毁来进行源码分析,springmvc版本4.3.18.关于使用及验证请参考另一篇jsp取addFlashAttribute值深入理解即springMVC发r ...

  4. springmvc源码学习

    1.springmvc运行流程 流程图是直接在百度图片中找的一张   >.前台发送请求,请求会首先通过DispatcherServlet进行url的匹配;如果匹配不到,看是否配置<mvc: ...

  5. ASP.NET Core MVC 源码学习:MVC 启动流程详解

    前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...

  6. springMVC源码学习之获取参数名

    1.入口到参数处理调用流程 入口为spring-webmvc-4.3.18.RELEASE.jar中org.springframework.web.servlet.DispatcherServlet. ...

  7. SpringMVC源码学习:容器初始化+MVC初始化+请求分发处理+参数解析+返回值解析+视图解析

    目录 一.前言 二.初始化 1. 容器初始化 根容器查找的方法 容器创建的方法 加载配置文件信息 2. MVC的初始化 文件上传解析器 区域信息解析器 handler映射信息解析 3. Handler ...

  8. springMvc源码学习之:spring源码总结

    转载自:http://www.cnblogs.com/davidwang456/p/4213652.html spring beans下面有如下源文件包: org.springframework.be ...

  9. springMvc源码学习之:spirngMVC获取请求参数的方法2

    @RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他 (@CookieValue)!她(@ModelAndView ...

随机推荐

  1. C++进阶--placement new/delete

    //############################################################################ // Placement New 和 Pl ...

  2. TCP/IP学习20180627-数据链路层-ethernet

    ifconfig :查看主機支持的網絡協議eth0:以太網接口lo:loopback接口 以太网(Ether-net)的定是指数字设备公司( Digital Equipment Corp.).英特尔公 ...

  3. PAT 乙级 1010 一元多项式求导 (25) C++版

    1010. 一元多项式求导 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 设计函数求一元多项式的导数.(注:xn(n为整数)的一 ...

  4. vue-router总结2

    在上一篇总结了vue-router中的路由切换.重定向和路由传参等知识,因为篇幅的原因,便将剩下的路由模块化.路由嵌套.history模式.路由守卫等放在这里来写了.因为是继续前面的写.所以代码也还是 ...

  5. [转][layui]table 的一个BUG

    转换静态表格,一直只能显示 10 行,研究发现解决方法有两个:1.参数里: limit: 30, 添加参数以确保显示更多行2.修改 table.js 里面的 F.prototype.config ,添 ...

  6. redis-5.0.3集群搭建

    首先部署redis-5.0.3,请参考我的另一篇文章 https://www.cnblogs.com/djlsunshine/p/10592174.html 启动redis服务 # redis-ser ...

  7. 一个简单的基于多进程实现并发的Socket程序

    在单进程的socket的程序的基础上,实现多进程并发效果的思路具体是:在server端开启“链接循环”,每建立一次链接就生成一个Process对象进行server-client的互动,而client端 ...

  8. Jmeter(三十八)Jmeter Question 之 ‘批量执行SQL语句’

    知识使我们变得玩世不恭,智慧使我们变得冷酷无情,我们思考的太多,感知太少,除了机器,我们更需要人性,除了智慧,我们需要仁慈和善良. ------出自查理卓别林的演讲 前面有提到Jmeter使用JDBC ...

  9. Centos7下的systemctl命令与service和chkconfig

    博主使用的操作系统是最新的CentOS 7,所以可能和网上一些老的博文有一定出入,那是因为版本更新的原因. 这里写图片描述1 service service命令用于对系统服务进行管理,比如启动(sta ...

  10. MySQL数据库order by 奇慢无比

    今天遇到个奇葩的问题, sql 数据量很大 有where 和order by,不加order by 速度很快,加了就很慢 一.首先我们对这条sql执行查询计划: explain select t.or ...