基于springboot2的springmvc执行流程(一)

基于springboot2的springmvc执行流程(一)

springmvc的详细流程图

在这里插入图片描述
为了读源码,我们需要把源码下载下来,然后打断点,通过debug来分析原来的运行流程。下面我们就一起来分析源码。

准备工作

一、首先,创建一个最简单的springboot程序在pom文件里面加上
org.springframework.boot
spring-boot-starter-web

依赖,就有了springmvc的功能。
二、创建一个controller案例
在这里插入图片描述
三、启动springboot工程
四、从流程图我们可以看出来springmvc的前端控制器其实就是DispatcherServlet。所以,直接在DispatcherServlet的入口方法里面打上断点,然后在浏览器访问本地项目进入debug流程

源码解析

在最早通过servlet编程的年代,我们都知道servlet的业务逻辑入口方法就是doService方法。debug会首先进入这个方法:
在这里插入图片描述
接着让debug进入doDispatch方法:
在这里插入图片描述
如图,代码的核心逻辑都写上了注释,一个springmvc流程在dispatcherservlet类里面的整体逻辑就是这些。
总结一下就是:
1、从RequestMethodHandlerMapping中获取HandlerMethod对象,结合存放在RequestMethodHandlerMapping里面的interceptor对象生成HandlerExecutionChain对象。
HandlerMethod对象是在容器启动的时候解析所有controller类得到的对象,里面包含了controller里面有requestMapping注解的方法的所有信息,这个详细源码我会在springmvc的启动流程中分析。
2、有了handlerMethod只是有了本次请求所对应的需要执行的逻辑的元信息,真正要执行这些逻辑,需要有对应的执行器,就是HandlerAdapter,第二步就是根据HandlerMethod找到对应的支持HandlerMethod的HandlerAdapter对象,在dispatcherServlet对象里面两个属性刚好存放着两种对象
在这里插入图片描述
这里的这两个对象以及后续见到的一些对象,从哪里来,怎么放进去的,如何初始化的,我会在spirngmvc启动流程源码分析中进行解析。

3、最后匹配到的是RequestMappingHandlerAdapter类型的对象,然后通过调用RequestMappingHandlerAdapter#handler实际执行handlerMethod,返回ModelAndView对象
4、再执行后置拦截器逻辑
5、渲染视图,如果是RestController模式,controller执行的返回值是通过ReturnValueHandler直接写入response对象,返回给调用者的,第三步返回的ModelAndView对象是空,没有后续的视图渲染逻辑,我们本次着重分析RestController模式,因为现在几乎都是前后端分离了。

结语

整个springmvc的执行流程在Dispatcher里面的执行流程就结束了,是不是很简单?
其实整个springmvc流程并不复杂,就如开篇里面那副图那样描述的,就只有那几个步骤,源码看起来很复杂,主要是springmvc在设计的时候考虑到了扩展性和易用性,用了很多设计模式,让源码看起来无比复杂。比如,模板方法,会有很多父子类,方法重写,方法重载,导致子类调用父类方法,父类又反过来调用子类方法,绕来绕去,很快就绕晕。还有就是里面很多地方用到了组合模式,处理一个逻辑的类多达几十种,光自己看,根本不知道跳到哪个类里面去,比如RequestMethodHandlerMapping就有十几种兄弟类,其实我们平时开发用的就只是RequestMethodHandlerMapping,我的源码分析也只是分析常用的那些类和方法。
总结起来,就有以下步骤:
1、获取HandlerMethod
2、找到HandlerAdapter
3、执行HandlerAdapter
4、解析方法参数
4、执行方法逻辑得到返回值
5、解析返回值
6、内容协商
7、将执行的结果值写入response对象

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页