【spring】Spring MVC 类图与源码请求处理流程

一、Spring MVC 类图概览

Spring MVC 的核心类图如下:

[DispatcherServlet] ───────────────────────────────┐
        │                                         │
        ▼                                         ▼
 HandlerMapping (如 RequestMappingHandlerMapping) ─▶ HandlerExecutionChain
        │                                         ▲
        ▼                                         │
 HandlerAdapter (如 RequestMappingHandlerAdapter) ─┘
        │
        ▼
  Controller (或 HandlerMethod)
        │
        ▼
 ModelAndView
        │
        ▼
  ViewResolver -> View (e.g. InternalResourceView)
        │
        ▼
 Render 页面或写出 JSON
  • DispatcherServlet 是入口,用它桥接 URL 和后续链条
  • HandlerMapping 方法查找 Controller
  • HandlerAdapter 负责调用 Controller 方法,并处理参数、返回值
  • ModelAndView 表示视图+模型数据
  • ViewResolver 找到实际 View,如 JSP/Thymeleaf
  • View 渲染视图内容

核心接口包括 ControllerHandlerAdapterHandlerInterceptorViewResolver


二、源码级详解 MVC 请求处理流程

本文以 Spring Framework 6.1 的源码为例,结合社区总结,对请求全过程逐步解析 ([tty4.dev][4])。

1. 容器/Filter 先行

请求先经过 Servlet 容器(如 Tomcat),再被 ApplicationFilterChain 按顺序调用已注册的 OncePerRequestFilter 处理器,再由其调用 DispatcherServlet.service(request,response)

2. DispatcherServlet.doService()

service() 方法内部调用 doService(),做基础准备,绑定 servlet 相关属性至 request 上,为 dispatch 做准备

3. DispatcherServlet.doDispatch()

doService() 内部调用 doDispatch(),这是整个请求处理的核心流程 ([tty4.dev][4])。

主要逻辑包括:

  • 解析 URL 和 HTTP 方法
  • 使用 HandlerMapping 找到 HandlerExecutionChain(包含 handler 和 interceptor)
  • 应用 HandlerInterceptor.preHandle() 处理前阶段逻辑
  • HandlerAdapter 调用 handler(Controller 方法)
  • Controller 返回 ModelAndView 或直接写 response
  • 再走 Interceptor.postHandle()afterCompletion()
  • 根据 ModelAndViewViewResolverView,渲染结果

简易流程图可参考 Java4s 等文章 ([docs.spring.io][6], [java4s.com][2], [geeksforgeeks.org][7], [en.wikipedia.org][1])。

4. HandlerMapping 阶段

RequestMappingHandlerMapping 解析 @RequestMapping@GetMapping 注解内容,构建 handler registry,Fast path 时根据 URL+HTTP 方法找到匹配 Controller 方法 。

5. HandlerAdapter 阶段

常用的是 RequestMappingHandlerAdapter,其核心逻辑:

  • handleInternal(...) 找到目标 HandlerMethod
  • 调用 HandlerMethod.invoke(...) -> invokeForRequest()
  • 支持参数解析,如路径变量、Query 参数、@RequestBody JSON 映射等
  • HandlerMethodArgumentResolverComposite 协调具体 HandlerMethodArgumentResolver 实现,例如 RequestResponseBodyMethodProcessor 处理 JSON body

具体步骤:

  1. 调用 getMethodArgumentValues()
  2. 遍历方法参数,用 HandlerMethodArgumentResolverComposite.resolveArgument()
  3. 比如 JSON:RequestResponseBodyMethodProcessorreadWithMessageConverters(),解析 JSON 为 POJO
  4. 完成后,调用 Controller 方法,得到返回值

6. ModelAndView 或单纯返回

Controller 返回 ModelAndView,Dispatcher 处理将数据模型、视图名交给 ViewResolver

如果方法返回 String 且标注如 @ResponseBody,会被视为要写回的 body(例如 JSON),对应 ResponseBodyAdviceHttpMessageConverter 再按内容类型序列化输出。

7. ViewResolver 阶段

根据逻辑视图名,用 InternalResourceViewResolver(JSP)或 Thymeleaf、FreeMarker 等策略,找实际 View 实现。然后调用 View.render(model, request, response) 渲染

8. Interceptor 阶段

整个过程中,已注册的 HandlerInterceptor 会在 Handler 调用前后(preHandlepostHandle)和完成后(afterCompletion)被执行,用于日志、权限、性能监控等。


三、流程一览与编码对应

对照来说:

  1. HTTP → Filter → DispatcherServlet
  2. doService() 设置环境
  3. doDispatch() 启动核心流程
  4. HandlerMapping 查找 Controller
  5. Interceptor preHandle
  6. HandlerAdapter 调用 Controller 方法(含参数解析)
  7. 返回 ModelAndView 或 body 内容
  8. Interceptor post/after
  9. ViewResolver 查视图
  10. 渲染输出

四、源码解读示例

下面结合源码和步骤简写一个例子流程理解:

@GetMapping("/login")
public @ResponseBody User login(@RequestBody LoginDto dto) {
  return userService.login(dto);
}
  • 请求到 /login, Spring 匹配 RequestMappingHandlerMapping

  • DispatcherServlet.doDispatch() 找到 HandlerMethod

  • RequestMappingHandlerAdapter.invokeHandlerMethod()

    • getMethodArgumentValues()
    • RequestResponseBodyMethodProcessor 用 Jackson 转 dto
  • Controller 执行,返回 User 对象

  • RequestResponseBodyMethodProcessor 用 Jackson 转 JSON 写回

  • DispatcherServlet 结束,返回 response


五、总结

  • 类图清晰:DispatcherServlet➡️HandlerMapping➡️HandlerAdapter➡️Controller➡️ViewResolver➡️View
  • 来源:DispatcherServlet.doDispatch() 为中心,全流程控制
  • 参数解析、消息转换、JSON 支持都是通过策略组件实现
  • 结合源码拆解流程,能快速知道每个环节干了啥

我精心收集了一份10万字的java全面知识总结,包括了java几乎所有的面试基础解读,有兴趣可以获取看看
领取方式

https://pan.quark.cn/s/4e6e3d03407a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值