Spring MVC 原理 - DispatcherServlet调用完整过程
本篇主要讲解了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调用完整过程相关推荐
- Spring MVC 原理探秘 - 一个请求的旅行过程
1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...
- Spring MVC 原理探秘 - 容器的创建过程
1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的.Spring MVC 可对外提供服务时,说明其已经处于了就绪状态.再次之前,Spring MVC 需要进行 ...
- Spring MVC原理及配置详解
转载自 http://blog.csdn.net/jianyuerensheng/article/details/51258942 [Spring]Spring MVC原理及配置 1.Spring M ...
- 一步一步手绘Spring MVC运行时序图(Spring MVC原理)
相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...
- 【Spring】Spring MVC原理及配置详解
[Spring]Spring MVC原理及配置 1.Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO ...
- Spring mvc 原理浅析
Spring MVC主要包括以下要点: 1:由DispatcherServlet控制的整个流程: 2:注解驱动的控制器,其中包括请求映射.数据的绑定和格式化: 3:文件上传: 4:一些杂项,如静态资源 ...
- Spring MVC 原理
文章目录 一.Spring MVC 原理 1.MVC流程 2.MVC常用注解 在这里插入图片描述 总结 一.Spring MVC 原理 Spring 的模型-视图-控制器(MVC)框架是围绕一个 Di ...
- Spring MVC的DispatcherServlet – Java开发人员应该知道的10件事
如果您使用过Spring MVC,那么您应该知道什么是DispatcherServlet? 它实际上是Spring MVC的心脏,确切地说是MVC设计模式或控制器的C语言. 应该由Spring MVC ...
- tomcat + spring mvc原理(二):tomcat容器初始化加载和启动
tomcat + spring mvc原理(二):tomcat容器动态加载 容器通用生命周期标准 容器通用生命周期的实现 生命周期状态监听器的管理实现 生命周期方法实现 宏观来看各种容器生命周期的实际 ...
最新文章
- 2021年 ,关于AI的哪些未来已来?
- 微服务网关Zuul迁移到Spring Cloud Gateway
- 单片机成长之路(51基础篇) - 008 C51 的标示符和关键字
- javascript 基础知识1 数据类型
- Java Web开发技术详解~Web的概念
- html中,怎么样才能获得iframe页面里的内容
- xor和gates的专杀脚本
- login.html错误,创建好login.html文件后,在git bash执行webpack出现错误
- 2018年第九届 蓝桥杯 java B组 部分题解
- js分页展示控件,传入简单参数就能使用的分页效果控件
- 记一次2048小游戏开发
- 高效的敏捷测试第十三课 自动化测试、用例测试、接口测试、大数据测试
- 制作U盘macos系统
- 单片机c语言6种开方,单片机快速开平方的算法
- 学习《医学三字经白话解》之心腹痛、胸痹
- 杨玲 201771010133《面向对象程序设计(java)》第十三周学习总结
- 通过CSS实现太极图案例
- weui 可移动悬浮按钮
- 成功解决百度网盘下载文件时遇到 下载总进度一直处于99.9%,显示一直下载不下来的问题
- C++11特性《 右值引用-<完美转发>、lambda表达式》
热门文章
- 上学吧在线计算机考试中心题库,上学吧考试题库
- 实验四 lr0分析程序的设计与实现_试验机海外直播丨实现高精度CAE分析实验的材料评价案例技术介绍...
- odoo 的字段。orm对象
- Python基础1(2017-07-16)
- BZOJ 4143: [AMPPZ2014]The Lawyer( sort )
- 打包签名时出现Conversion to Dalvik format failed with error 1
- Hadoop 2.4.1 设置问题小结【原创】
- AspxTreeList获取选中项的值
- Linq to xml 示例分析
- 员工借款及还款场景演练