本篇主要讲解了Spring mvc的调用过程,通过这个过程来了解Spring的原理。

进入web.xml中配置的Spring拦截(调度)器:

调用堆栈信息:

开始拦截,这一步主要是根据request获取handler(该handler可以配置):

(接上面方法)这段代码中的if(isGet…主要解决浏览器的缓存问题,如果没有过修改,则返回(浏览器可能会用缓存响应)。

调用方法handler:

进入handler方法:

进入方法invokeHandlerMethod:

440行进入下一个方法invokeHandlerMethod:

进入该方法:

171行进入处理参数的方法:

处理参数的方法,使用参数类型进行for循环:

获取一个参数的注解:

通过下面方法返回注解数组:

其中parameterIndex在创建该对象时赋值,和参数类型的位置是对应的(下图中的i):

获取注解之后,对注解进行遍历,通过判断注解类型来获取paramName或headerName或其他:

在每个if中的defaultValue中,方法parseDefaultValueAttribute用来获取注解的默认值设置:

可以看到系统用了一个不常用的字符串作为默认值,用这个值和传入的value进行比较,使用这个值的目的是尽可能和用户设置的值区分开。

指定类型的注解(if判断里面的),只能存在一个,超过1个会报错:

如果没有注解,则判断类型是否为常用的(request,response,session等):

对于没有注解的参数,可能会执行下面的方法:

进入处理标准类型的方法:

通过上面的方法判断出基本的类型。

回到有注解的情况,针对不同的注解,具体处理过程如下(if顺序没有优先级,因为只有一个注解,一种情况):

到这一步,会根据具体的注解类型执行不同的resolve***()方法。

resolve***的方法最终返回的是类型符合要求(resolve内部有各种类型转换的方法)的参数值。

最后处理完成,返回参数列表:

反射调用方法:

进入用户写的处理方法中:

在用户方法执行完成后,返回:

返回result之后,使用result去获取ModelAndView,执行方法getModelAndView:

该方法主要通过result返回值来判断:

当前方法是带ResponseBody注解的,所以执行到这里:

进去方法:

这里是根据http类型做出相应的输出:

用户配置的:

接收的类型:

写的方法:

这里配置的json格式,所以会进入JSON方法:

写入ResponseBody后,返回mav:

最后返回之前调用handler的地方,之后会有一些不同种类的拦截器方法:

拦截器如:

还有一些处理不同异常情况的拦截器。

系统默认都会去执行一个拦截器,这个拦截器基本上都是空方法,是一个private类:

返回调用doDIspatch的地方:

返回到doService的地方:

最后回到httpservlet的service方法:

到这里就完成了一次完整的调用过程。

可以发现,整个过程的流程是比较清晰,程序启动时会根据mvc的配置和spring配置来处理配置信息和注解的类。

Servlet处理请求,通过request(主要是url)来获取handler,之后最主要的一个部分就是获取需要注入的参数,最后调用用户方法,处理返回结果。

整个过程中麻烦的地方就是在一些细节的处理上,这些细节未必一开始就有的,一开始应该是一个主要的流程,后续发现问题或者为了通用性做的改进。

Spring MVC 原理 - DispatcherServlet调用完整过程相关推荐

  1. Spring MVC 原理探秘 - 一个请求的旅行过程

    1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...

  2. Spring MVC 原理探秘 - 容器的创建过程

    1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的.Spring MVC 可对外提供服务时,说明其已经处于了就绪状态.再次之前,Spring MVC 需要进行 ...

  3. Spring MVC原理及配置详解

    转载自 http://blog.csdn.net/jianyuerensheng/article/details/51258942 [Spring]Spring MVC原理及配置 1.Spring M ...

  4. 一步一步手绘Spring MVC运行时序图(Spring MVC原理)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  5. 【Spring】Spring MVC原理及配置详解

    [Spring]Spring MVC原理及配置 1.Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO ...

  6. Spring mvc 原理浅析

    Spring MVC主要包括以下要点: 1:由DispatcherServlet控制的整个流程: 2:注解驱动的控制器,其中包括请求映射.数据的绑定和格式化: 3:文件上传: 4:一些杂项,如静态资源 ...

  7. Spring MVC 原理

    文章目录 一.Spring MVC 原理 1.MVC流程 2.MVC常用注解 在这里插入图片描述 总结 一.Spring MVC 原理 Spring 的模型-视图-控制器(MVC)框架是围绕一个 Di ...

  8. Spring MVC的DispatcherServlet – Java开发人员应该知道的10件事

    如果您使用过Spring MVC,那么您应该知道什么是DispatcherServlet? 它实际上是Spring MVC的心脏,确切地说是MVC设计模式或控制器的C语言. 应该由Spring MVC ...

  9. tomcat + spring mvc原理(二):tomcat容器初始化加载和启动

    tomcat + spring mvc原理(二):tomcat容器动态加载 容器通用生命周期标准 容器通用生命周期的实现 生命周期状态监听器的管理实现 生命周期方法实现 宏观来看各种容器生命周期的实际 ...

最新文章

  1. 2021年 ,关于AI的哪些未来已来?
  2. 微服务网关Zuul迁移到Spring Cloud Gateway
  3. 单片机成长之路(51基础篇) - 008 C51 的标示符和关键字
  4. javascript 基础知识1 数据类型
  5. Java Web开发技术详解~Web的概念
  6. html中,怎么样才能获得iframe页面里的内容
  7. xor和gates的专杀脚本
  8. login.html错误,创建好login.html文件后,在git bash执行webpack出现错误
  9. 2018年第九届 蓝桥杯 java B组 部分题解
  10. js分页展示控件,传入简单参数就能使用的分页效果控件
  11. 记一次2048小游戏开发
  12. 高效的敏捷测试第十三课 自动化测试、用例测试、接口测试、大数据测试
  13. 制作U盘macos系统
  14. 单片机c语言6种开方,单片机快速开平方的算法
  15. 学习《医学三字经白话解》之心腹痛、胸痹
  16. 杨玲 201771010133《面向对象程序设计(java)》第十三周学习总结
  17. 通过CSS实现太极图案例
  18. weui 可移动悬浮按钮
  19. 成功解决百度网盘下载文件时遇到 下载总进度一直处于99.9%,显示一直下载不下来的问题
  20. C++11特性《 右值引用-<完美转发>、lambda表达式》

热门文章

  1. 上学吧在线计算机考试中心题库,上学吧考试题库
  2. 实验四 lr0分析程序的设计与实现_试验机海外直播丨实现高精度CAE分析实验的材料评价案例技术介绍...
  3. odoo 的字段。orm对象
  4. Python基础1(2017-07-16)
  5. BZOJ 4143: [AMPPZ2014]The Lawyer( sort )
  6. 打包签名时出现Conversion to Dalvik format failed with error 1
  7. Hadoop 2.4.1 设置问题小结【原创】
  8. AspxTreeList获取选中项的值
  9. Linq to xml 示例分析
  10. 员工借款及还款场景演练