Spring 源码解析 | Spring MVC 实战

简介: Spring MVC 说 Spring 框架的一部分,也可以说是 Spring 的一个模块。 本文依据 Spring 6.x 进行展开讲解,本文使用的源码,在参考资料中可以下载。

请求流程


首先我们先来回顾一下 Spring MVC 的请求流程,具体的流程如下图所示



image.png


  1. DispatcherServlet: 前端调度器,将前端请求拦截下来分发到各控制器方法中 。


  1. HandlerMapping: 负责根据请求的 URL 和 @RequestMapping 映射进行匹配, 匹配到会返回Handler(本质就是具体控制器的方法)。


  1. HandlerAdaper: 负责调用Handler具体的方法然后返回视图的名字 Handler将它封 ModelAndView( 封装成视图名,request 域 数据)


  1. ViewReslover: 根据 ModelAndView 里面的视图名地址去找到具体的jsp封装在View对象中;


  1. View:进行视图渲染(将jsp转换成html内容 --这是Servlet容器的事情) 最终response 到的客户端。


核心文件


Spring MVC 核心类文件


  • DispatcherServlet


  • HadlerMapping


  • RequestMappingHandlerAdapter


DispatcherServlet


DispatcherServlet 是 Spring MVC 的核心类,它的本质是一个 Servlet 。经过 WEB 容器,比如:Tomcat 等。会调用 doService 方法,后面经过一段逻辑之后,主要是将核心逻辑交给了 DispatcherServlet#doDispatch 进行处处理的步骤如下


image.png


HadlerMapping


HandlerMapping 主要是用来处理请求的,将咱们的 @RequestMapping 注解上配置的地址,请求方式,以及其他限制定位到具体的一个处理器上。具体处理流程如下:(注:图片来源于网络)


image.png

image.png

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a9da7a7a6bf4402aa57f0330b3584762~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp


RequestMappingHandlerAdapter


RequestMappingHandlerAdapter 实现了 HandlerAdapter 接口,顾名思义,表示 handler 的 adapter,这里的 handler 指的是 Spring 处理具体请求的某个Controller的方法,也就是说HandlerAdapter指的是将当前请求适配到某个 Handler的处理器 。RequestMappingHandlerAdapter 是 HandlerAdapter 的一个具体实现,主要用于将某个请求适配给 @RequestMapping 类型的 Handler 处理。


HandlerAdapter 的接口定义如下:


public interface HandlerAdapter {
    // 用于判断当前HandlerAdapter是否能够处理当前请求
    boolean supports(Object handler);
    // 如果当前HandlerAdapter能够用于适配当前请求,那么就会处理当前请求中
    // 诸如参数和返回值等信息,以便能够直接委托给具体的Handler处理
    ModelAndView handle(HttpServletRequest request, HttpServletResponse response, 
        Object handler) throws Exception;
    // 获取当前请求的最后更改时间,主要用于供给浏览器判断当前请求是否修改过,
    // 从而判断是否可以直接使用之前缓存的结果
    long getLastModified(HttpServletRequest request, Object handler);
}


使用过程


导入依赖


implementation project(":spring-webmvc")


逻辑代码


@RestController
@RequestMapping("/summer")
public class SummerController {
  @RequestMapping("/requestTest")
  public CommonResult<SummerVo> requestTest(@RequestBody SummerModel summerModel) {
    SummerVo summerVo = new SummerVo();
    BeanUtils.copyProperties(summerModel, summerVo);
    return CommonResult.success(summerVo);
  }
}


地址请求


请求地址:


http://ip:port/summer/requestTest


代码请求过程


Spring MVC 总结


  1. Spring MVC 是一个优秀的 MVC 框架,它是 Spring 框架的一部分。


  1. 我们项目通过 Spring MVC 组件的集成和使用,可以提高我们的开发效率。让开发者可以更加专注与业务本身的开发。


参考资料




相关文章
|
8天前
yolo-world 源码解析(六)(2)
yolo-world 源码解析(六)
18 0
|
8天前
yolo-world 源码解析(六)(1)
yolo-world 源码解析(六)
12 0
|
8天前
yolo-world 源码解析(五)(4)
yolo-world 源码解析(五)
19 0
|
8天前
yolo-world 源码解析(五)(1)
yolo-world 源码解析(五)
31 0
|
8天前
yolo-world 源码解析(二)(2)
yolo-world 源码解析(二)
21 0
|
22天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
51 1
|
26天前
|
存储 NoSQL 算法
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)(二)
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)
42 0
|
8天前
Marker 源码解析(二)(3)
Marker 源码解析(二)
14 0
|
8天前
Marker 源码解析(一)(4)
Marker 源码解析(一)
13 0

推荐镜像

更多