一、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/ThymeleafView
渲染视图内容
核心接口包括 Controller
、HandlerAdapter
、HandlerInterceptor
、ViewResolver
等
二、源码级详解 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()
- 根据
ModelAndView
用ViewResolver
找View
,渲染结果
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
具体步骤:
- 调用
getMethodArgumentValues()
- 遍历方法参数,用
HandlerMethodArgumentResolverComposite.resolveArgument()
- 比如 JSON:
RequestResponseBodyMethodProcessor
调readWithMessageConverters()
,解析 JSON 为 POJO - 完成后,调用 Controller 方法,得到返回值
6. ModelAndView 或单纯返回
Controller 返回 ModelAndView
,Dispatcher 处理将数据模型、视图名交给 ViewResolver
。
如果方法返回 String
且标注如 @ResponseBody
,会被视为要写回的 body(例如 JSON),对应 ResponseBodyAdvice
、HttpMessageConverter
再按内容类型序列化输出。
7. ViewResolver 阶段
根据逻辑视图名,用 InternalResourceViewResolver
(JSP)或 Thymeleaf、FreeMarker 等策略,找实际 View
实现。然后调用 View.render(model, request, response)
渲染
8. Interceptor 阶段
整个过程中,已注册的 HandlerInterceptor
会在 Handler 调用前后(preHandle
/postHandle
)和完成后(afterCompletion
)被执行,用于日志、权限、性能监控等。
三、流程一览与编码对应
对照来说:
- HTTP → Filter → DispatcherServlet
doService()
设置环境doDispatch()
启动核心流程- HandlerMapping 查找 Controller
- Interceptor
preHandle
- HandlerAdapter 调用 Controller 方法(含参数解析)
- 返回
ModelAndView
或 body 内容 - Interceptor post/after
- ViewResolver 查视图
- 渲染输出
四、源码解读示例
下面结合源码和步骤简写一个例子流程理解:
@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