【源码剖析】Spring MVC 详解

shadowLogo

在之前的博文中,本人讲解了 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 可作为 客户端请求的 出入口


接收请求:

我们也知道:

客户端请求路由过来时,会调用 目标ServletdoGet()、doPost()之类的方法

那么,按照逻辑,当客户端请求传来时,一般就会调用 doGet()方法

doGet()方法:

但是,在 DispatcherServlet 中,并没有 doGet()方法 的具体实现逻辑
因此,就会由其 父类 实现:
doXxx
那么,我们继续跟进 442行 代码,看看具体的实现逻辑:
具体实现


分发 请求:

我们继续跟进,就会到 DispatcherServlet类doService()方法:
转发
我们可以看到:

在给一些属性赋值之后,就根据 请求类型,进行 请求分发


获取 处理器执行链 和 处理器适配器:

分发处理1
我们可以跟进 484行 代码,看看是不是 处理器执行链
验证
可以看到:

上文所讲内容正确!


我们接着往下看:
分发处理2

可以看到:

doDispatch()方法 中,将 客户端请求 分发给了 匹配到的处理器
并将 处理结果数据,渲染到页面中,返回给 客户端


没有匹配的处理器 —— noHandlerFound()方法:

没匹配
可以看到:

如果没有找到 匹配的处理器,就会 抛出异常 或者 返回404


处理器适配器 处理请求:

我们接着来看下 doDispatch()方法504行 代码:
包装
我们可以看到:

这是一个 包装方法

我们继续跟进去:
执行处理方法
继续跟进去:
处理逻辑


具体处理器 处理请求:

我们继续跟进 543行 代码:
返回值
继续跟进 51行 代码:
处理逻辑
继续跟进 59行 代码:
反射调用
可以看到:

通过 反射机制,执行了 具体处理器处理方法


那么,我们再来看下 请求处理 之后的代码:

渲染页面:

渲染

我们跟进 517行 代码:
渲染页面
继续跟进 516行 代码:
渲染

其实,跟到这里,我们已经没有必要跟下去了

因为,Spring MVC总体执行流程 在上文中,基本上都得以体现了!


那么,最后本人再来通过上文所给出的 执行流程图,来总结下 本文内容:

执行流程:

执行流程


至此,Spring MVC大体执行流程 就讲解完毕了!

那么,相信看过本人 之前三篇博文 —— 《【源码剖析】Spring IOC 详解》、《【源码剖析】Spring AOP 详解》、《【源码剖析】Spring 事务 详解》的同学,在看本篇博文时,一定会很轻松!

正如本人一直以来所讲那样:

学习,要一步一步踏踏实实来走
只有这样,在我们走后面的路时,才能走得更快

觉得有所帮助的同学,请关注并点赞,谢谢!!!
程序员

posted @ 2021-03-25 19:05  在下右转,有何贵干  阅读(85)  评论(0编辑  收藏  举报