

1. 用户发起请求
- HTTP 请求:用户通过浏览器或客户端发送请求到服务器(如
http://example.com/app/user/1
)。
2. DispatcherServlet 接收请求
- 前端控制器:所有请求首先被
DispatcherServlet
(前端控制器)拦截。
DispatcherServlet
是 Spring MVC 的核心,继承自 HttpServlet
,负责统一调度。- 初始化时加载
HandlerMapping
、HandlerAdapter
、ViewResolver
等组件。
3. 确定处理器(Handler)
- HandlerMapping:
DispatcherServlet
查询所有 HandlerMapping
实现,找到匹配当前请求的处理器(HandlerExecutionChain
)。
- 默认实现:
RequestMappingHandlerMapping
(处理 @RequestMapping
注解)。 - 处理器链:包含目标 Controller 方法及相关的拦截器(
Interceptor
)。
4. 执行拦截器(Interceptor)的 preHandle 方法
- 拦截器前置处理:按顺序调用所有拦截器的
preHandle()
方法。
- 返回值:若某个拦截器返回
false
,流程终止,直接返回响应。 - 典型用途:权限检查、日志记录。
5. 调用处理器适配器(HandlerAdapter)
- HandlerAdapter:
DispatcherServlet
通过 HandlerAdapter
执行具体的处理器(Controller 方法)。
- 默认实现:
RequestMappingHandlerAdapter
(处理 @Controller
和 @RequestMapping
)。 - 参数解析:使用
HandlerMethodArgumentResolver
解析方法参数(如 @RequestParam
、@PathVariable
)。 - 数据绑定与验证:处理
@Valid
注解,执行数据校验。
6. 执行 Controller 方法
- 业务处理:Controller 方法处理请求,返回结果。
- 返回类型:可能是
ModelAndView
、视图名称(String
)、@ResponseBody
注解的响应体或 ResponseEntity
。
7. 处理返回结果
- 结果处理:
HandlerAdapter
处理 Controller 方法的返回值。
- 视图渲染:若返回
ModelAndView
或视图名称,进入视图解析流程。 - 直接响应:若返回
@ResponseBody
或 ResponseEntity
,跳过视图解析,直接通过 HttpMessageConverter
转换数据格式(如 JSON)。
8. 执行拦截器的 postHandle 方法
- 拦截器后置处理:按倒序调用拦截器的
postHandle()
方法。
9. 视图解析与渲染
- ViewResolver:将逻辑视图名解析为具体视图(如 JSP、Thymeleaf)。
- 默认实现:
InternalResourceViewResolver
(解析 JSP)。
- 视图渲染:将模型数据填充到视图中,生成 HTML 或其他格式的响应内容。
10. 执行拦截器的 afterCompletion 方法
- 请求完成处理:所有拦截器的
afterCompletion()
方法被调用(无论成功或异常)。
11. 返回响应
- HTTP 响应:生成的响应内容通过
DispatcherServlet
返回给客户端。
异常处理流程
- HandlerExceptionResolver:若处理过程中抛出异常,由该组件捕获并处理。
- 常用实现:
ExceptionHandlerExceptionResolver
(处理 @ExceptionHandler
注解)。ResponseStatusExceptionResolver
(处理 @ResponseStatus
注解)。DefaultHandlerExceptionResolver
(处理标准 Spring 异常)。
- 全局异常处理:通过
@ControllerAdvice
类集中处理异常。
关键组件总结
组件 | 职责 |
---|
DispatcherServlet | 前端控制器,统一调度请求处理流程。 |
HandlerMapping | 映射请求到处理器(Controller 方法)。 |
HandlerAdapter | 执行处理器方法,处理参数解析和数据绑定。 |
ViewResolver | 解析逻辑视图名到具体视图实现。 |
HandlerInterceptor | 拦截请求,在处理器执行前后插入逻辑。 |
HttpMessageConverter | 转换请求/响应数据(如 JSON ↔ Java 对象)。 |
HandlerExceptionResolver | 统一处理异常,返回友好错误响应。 |
执行流程图解
HTTP Request
↓
DispatcherServlet
↓
HandlerMapping → HandlerExecutionChain(Handler + Interceptors)
↓
Interceptor.preHandle()
↓
HandlerAdapter.handle() → Controller Method
↓
Interceptor.postHandle()
↓
ViewResolver.resolveViewName() → View
↓
View.render()
↓
Interceptor.afterCompletion()
↓
HTTP Response
示例场景:获取用户信息
- 请求:
GET /user/1
- DispatcherServlet 接收请求,查询
HandlerMapping
。 - 匹配到
UserController
的 getUser(@PathVariable Long id)
方法。 - 拦截器检查权限(
preHandle
)。 - HandlerAdapter 解析
id=1
,调用 getUser
方法。 - Controller 返回
User
对象(@ResponseBody
)。 - HttpMessageConverter 将
User
转为 JSON。 - 拦截器记录日志(
postHandle
)。 - 返回 JSON 响应
{"id":1, "name":"Alice"}
。