SpringMVC 执行流程详解

SpringMVC 的执行流程是 Web 框架篇最核心的问题。它不是让你机械背 11 个步骤,而是要理解一次请求从浏览器进来后,SpringMVC 是怎么找到 Controller、调用方法、处理参数、处理返回值的。

一句话概括:请求先进入 DispatcherServlet,再通过 HandlerMapping 找到处理器,通过 HandlerAdapter 调用 Controller,最后根据返回类型走视图渲染或 JSON 响应。


ModelAndView
ResponseBody
浏览器发送请求
DispatcherServlet

前端控制器
HandlerMapping

查找处理器
返回

HandlerExecutionChain
HandlerAdapter

调用 Controller
Controller

执行业务方法
返回类型
ViewResolver

解析视图
渲染 JSP 页面
HttpMessageConverter

转 JSON
响应前端

核心组件先记住

组件 作用
DispatcherServlet 前端控制器,统一接收请求和分发请求
HandlerMapping 处理器映射器,根据请求路径找到具体 Handler
HandlerExecutionChain 处理器执行链,包含 Handler 和拦截器
HandlerAdapter 处理器适配器,负责真正调用 Controller 方法
ViewResolver 视图解析器,把逻辑视图名解析成真正视图
HttpMessageConverter 消息转换器,把 Java 对象转换成 JSON 等响应体

如果是传统 JSP 项目,会走视图解析和渲染;如果是前后端分离接口项目,通常通过 @ResponseBody 或 @RestController 直接返回 JSON。

传统 JSP 视图流程

传统视图阶段的完整流程可以这样理解:

  1. 用户发送请求,请求进入 DispatcherServlet。
  2. DispatcherServlet 调用 HandlerMapping。
  3. HandlerMapping 根据 URL 找到对应的 Handler,并返回 HandlerExecutionChain。
  4. DispatcherServlet 调用 HandlerAdapter。
  5. HandlerAdapter 负责参数处理,然后调用 Controller 方法。
  6. Controller 执行业务逻辑,返回 ModelAndView。
  7. HandlerAdapter 把 ModelAndView 返回给 DispatcherServlet。
  8. DispatcherServlet 把逻辑视图名交给 ViewResolver。
  9. ViewResolver 返回真正的 View 对象。
  10. DispatcherServlet 渲染视图,把模型数据填充到页面。
  11. 响应用户。

这里的重点是 ModelAndView。它既包含模型数据,也包含视图信息。

前后端分离接口流程

现在更多项目是前后端分离,Controller 返回对象,由框架转成 JSON。


HTTP 请求
DispatcherServlet
定位

Controller 方法
解析 PathVariable

RequestBody 等参数
执行接口方法
返回 Java 对象
HttpMessageConverter

序列化
JSON 写入响应体

流程相比 JSP 会短一些:

  1. 请求进入 DispatcherServlet。
  2. HandlerMapping 找到对应 Controller 方法。
  3. HandlerAdapter 调用 Controller 方法。
  4. 方法上有 @ResponseBody,或者类上有 @RestController。
  5. SpringMVC 使用 HttpMessageConverter 把返回对象转换成 JSON。
  6. 直接写入响应体返回给前端。

示例:

java 复制代码
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/getById/{id}")
    public User getById(@PathVariable Integer id) {
        return userService.getById(id);
    }
}

@RestController 等价于 @Controller + @ResponseBody,所以方法返回的 User 不会被当成视图名,而是会被转换成 JSON。

HandlerAdapter 为什么需要适配

Controller 方法的写法很多:

java 复制代码
@GetMapping("/user/{id}")
public User getById(@PathVariable Integer id) {
    return userService.getById(id);
}
java 复制代码
@PostMapping("/user")
public User save(@RequestBody User user) {
    return userService.save(user);
}

SpringMVC 要处理路径参数、请求参数、请求体、请求头、返回对象等各种形式。HandlerAdapter 的价值就是屏蔽这些差异,用统一方式调用处理器。

参数解析和返回值处理,大多发生在 HandlerAdapter 调用 Controller 的过程中。

常见注解顺手记

注解 作用
@RequestMapping 映射请求路径,可用在类和方法上
@GetMapping / @PostMapping 更具体的请求方式映射
@RequestBody 接收请求体 JSON,并转换成 Java 对象
@RequestParam 获取请求参数
@PathVariable 获取路径变量,例如 /user/{id}
@ResponseBody 把返回对象写入响应体
@RequestHeader 获取请求头
@RestController @Controller + @ResponseBody

面试回答模板

可以这样回答:

SpringMVC 请求首先进入前端控制器 DispatcherServlet,它会调用 HandlerMapping 根据请求路径查找具体处理器,返回处理器执行链。然后 DispatcherServlet 调用 HandlerAdapter,由适配器完成参数解析并执行 Controller 方法。如果是传统 JSP,Controller 返回 ModelAndView,再通过 ViewResolver 解析视图并渲染。如果是前后端分离接口,方法上有 @ResponseBody 或使用 @RestController,返回值会通过 HttpMessageConverter 转成 JSON 响应给前端。

小结

SpringMVC 执行流程可以压缩成一条主线:

DispatcherServlet 接收请求 -> HandlerMapping 找方法 -> HandlerAdapter 调方法 -> ViewResolver 渲染页面或 HttpMessageConverter 返回 JSON。

面试时先讲主线,再区分 JSP 和前后端分离两种返回路径,就不会乱。

相关推荐
程序猿乐锅14 分钟前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
Java后端的Ai之路25 分钟前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
Flynn Liang41 分钟前
Spring AI 上生产:限流熔断、密钥与成本治理、私有化/混合部署、降级与 Prompt 灰度架构全解
人工智能·spring·架构·高可用·springai·成本治理·生产架构
AntsData1 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat1 小时前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰1 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
Flynn Liang1 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
灿飞1 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
计算机毕设定制辅导-无忧学长2 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
雪芽蓝域zzs2 小时前
第 1 章:IDEA 创建 SpringBoot3.5.16 Maven 项目
java·maven·intellij-idea