【源码剖析】Spring MVC 详解
在之前的博文中,本人讲解了 Spring Framework 系列
的 相关 核心源码
那么,在本篇博文中,本人就来讲解下 Spring MVC
的 核心源码:
首先,本人来 给出一个 API调用 案例:
API调用:
由于 Spring MVC
的 主要作用 是 处理 controller层 逻辑
本人就在这里 仅展示 controller层代码 和 一个 返回的页面:
controller层:
package edu.youzg.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
@RequestMapping("/hello/{name}")
public ModelAndView hello(@PathVariable("name") String name){
System.out.println("调用hello接口");
ModelAndView mv = new ModelAndView();
mv.setViewName("success");
mv.addObject("userName", name);
return mv;
}
}
view层:
sucess.html:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>成功页面</title>
</head>
<body>
执行成功!
</body>
</html>
现在,本人就来讲解下 Spring MVC
的 核心源码:
在本人之前的 Spring MVC API系列
博文中,本人也说明了:
Spring MVC
的 执行流程:
我们从上图中,能明显看出:
DispatcherServlet 是 客户端请求的 出入口
但是,我们也学习过 Java Web,也清楚:
在 Java原生API 中,
Servlet
是 客户端请求的 出入口
那么,为什么 DispatcherServlet 能代替 Java原生Servlet 接收客户端请求呢?
本人先来讲解下 DispatcherServlet 的 继承关系:
DispatcherServlet 继承关系:
我们从上图中,也可以看出:
DispatcherServlet 继承自 Java原生Servlet
因此,DispatcherServlet 可作为 客户端请求的 出入口
接收请求:
我们也知道:
客户端请求路由过来时,会调用 目标Servlet 的 doGet()、doPost()之类的方法
那么,按照逻辑,当客户端请求传来时,一般就会调用 doGet()方法:
doGet()方法:
但是,在 DispatcherServlet 中,并没有 doGet()方法 的具体实现逻辑
因此,就会由其 父类 实现:
那么,我们继续跟进 442行 代码,看看具体的实现逻辑:
分发 请求:
我们继续跟进,就会到 DispatcherServlet类 的 doService()方法:
我们可以看到:
在给一些属性赋值之后,就根据 请求类型,进行 请求分发
获取 处理器执行链 和 处理器适配器:
我们可以跟进 484行 代码,看看是不是 处理器执行链:
可以看到:
上文所讲内容正确!
我们接着往下看:
可以看到:
在 doDispatch()方法 中,将 客户端请求 分发给了 匹配到的处理器
并将 处理结果数据,渲染到页面中,返回给 客户端
没有匹配的处理器 —— noHandlerFound()方法:
可以看到:
如果没有找到 匹配的处理器,就会
抛出异常
或者返回404
处理器适配器 处理请求:
我们接着来看下 doDispatch()方法 的 504行 代码:
我们可以看到:
这是一个 包装方法
我们继续跟进去:
继续跟进去:
具体处理器 处理请求:
我们继续跟进 543行 代码:
继续跟进 51行 代码:
继续跟进 59行 代码:
可以看到:
通过
反射机制
,执行了 具体处理器 的 处理方法
那么,我们再来看下 请求处理 之后的代码:
渲染页面:
我们跟进 517行 代码:
继续跟进 516行 代码:
其实,跟到这里,我们已经没有必要跟下去了
因为,Spring MVC
的 总体执行流程 在上文中,基本上都得以体现了!
那么,最后本人再来通过上文所给出的 执行流程图,来总结下 本文内容:
执行流程:
至此,Spring MVC
的 大体执行流程 就讲解完毕了!
那么,相信看过本人 之前三篇博文 —— 《【源码剖析】Spring IOC 详解》、《【源码剖析】Spring AOP 详解》、《【源码剖析】Spring 事务 详解》的同学,在看本篇博文时,一定会很轻松!
正如本人一直以来所讲那样:
学习,要一步一步踏踏实实来走
只有这样,在我们走后面的路时,才能走得更快
觉得有所帮助的同学,请关注并点赞,谢谢!!!