Java 外功基础(1) —— Spring Web MVC
在 Java 后端开发中,Spring Web MVC 仍然是 2025–2026 年最主流、最广泛使用的 Web 框架内核(即使你现在主要写 Spring Boot、Spring Cloud,也绕不开它)。
Spring Boot 把配置极大简化了,但核心思想、组件关系、请求处理流程、核心组件的职责这些“外功”没有变。
真正写出高质量、可维护、可诊断的 Spring Web 项目,对 MVC 底层原理的理解程度决定了你的上限。
一、Spring Web MVC 核心架构图(最重要的一张图)
客户端请求
↓
DispatcherServlet ← 前端控制器(唯一入口)
↓
HandlerMapping ← 根据 URL、方法、参数等找到 Handler(Controller 方法)
↓
HandlerAdapter ← 适配器(调用真正的 Controller 方法)
↓
Controller(@Controller / @RestController) ← 你的业务代码
↓
ViewResolver(视图解析器) ← 决定返回什么视图(JSP/Thymeleaf)或直接写响应体(JSON)
↓
View / ResponseBody ← 最终输出(HTML / JSON / 文件流等)
↑
异常处理(@ExceptionHandler / HandlerExceptionResolver)
一句话总结:
DispatcherServlet 是中央调度员,它把所有请求接管过来,然后通过一系列组件(Mapping → Adapter → Controller → Resolver)完成“找到谁处理 → 怎么处理 → 返回什么”的全流程。
二、Spring MVC 九大核心组件(2025 年仍然有效)
| 序号 | 组件名称 | 全称 / 接口 | 主要职责 | 是否必须自己配(Boot 默认) | 面试高频程度 |
|---|---|---|---|---|---|
| 1 | DispatcherServlet | 前端控制器 | 整个 MVC 的入口,接收所有请求 | Boot 自动注册 | ★★★★★ |
| 2 | HandlerMapping | Handler 映射器 | 根据请求找到对应的 Handler(Controller 方法) | Boot 默认有很多实现 | ★★★★☆ |
| 3 | HandlerAdapter | Handler 适配器 | 真正调用 Controller 方法的执行者 | Boot 默认 | ★★★★☆ |
| 4 | HandlerExceptionResolver | 异常解析器 | 统一处理 Controller 抛出的异常 | Boot 默认 + 可自定义 | ★★★★☆ |
| 5 | ViewResolver | 视图解析器 | 把逻辑视图名解析成真实视图(或 JSON) | Boot 默认(Thymeleaf 等) | ★★★☆☆ |
| 6 | View | 视图接口 | 最终渲染输出(HTML / JSON / PDF 等) | — | ★★☆☆☆ |
| 7 | MultipartResolver | 文件上传解析器 | 处理 multipart/form-data 请求 | Boot 默认 | ★★★☆☆ |
| 8 | LocaleResolver | 国际化解析器 | 确定当前请求的语言环境 | Boot 默认 | ★★☆☆☆ |
| 9 | ThemeResolver | 主题解析器 | 支持换皮肤(现在很少用) | Boot 默认 | ★☆☆☆☆ |
最常被问的三个组件:
- HandlerMapping → RequestMappingHandlerMapping(@RequestMapping 解析)
- HandlerAdapter → RequestMappingHandlerAdapter(执行 Controller 方法)
- ViewResolver → ContentNegotiatingViewResolver(内容协商)/ ThymeleafViewResolver
三、一次完整 HTTP 请求的执行流程(面试八股文)
- 用户发送请求 → Tomcat → DispatcherServlet(web.xml 或 Boot 自动注册)
- DispatcherServlet 调用 HandlerMapping → 得到 HandlerExecutionChain(包含 Controller 方法 + 拦截器)
- DispatcherServlet 调用 HandlerAdapter → 执行 Controller 方法
- 解析 @RequestParam、@PathVariable、@RequestBody
- 进行参数绑定、类型转换、校验
- 执行目标方法
- Controller 返回值(ModelAndView / @ResponseBody / ResponseEntity 等)
- 如果是视图名 → ViewResolver 解析 → 渲染 View
- 如果是 @ResponseBody → HttpMessageConverter 转成 JSON/XML 等
- 响应写回客户端
- 过程中任何异常 → HandlerExceptionResolver 处理(@ExceptionHandler / @ControllerAdvice)
四、2025–2026 年最常考的 10 个核心知识点(建议全部掌握)
@Controllervs@RestController的本质区别(后者 = 前者 + @ResponseBody)@RequestMapping的各种写法(method、params、headers、consumes、produces)- 内容协商(Content Negotiation)机制(Accept 头决定返回 JSON/HTML)
@RequestBodyvs@ResponseBodyvs HttpMessageConverter- Spring MVC 的参数绑定机制(WebDataBinder)
@PathVariable、@RequestParam、@RequestHeader、@CookieValue、@ModelAttribute区别@ControllerAdvice+@ExceptionHandler全局异常处理- 文件上传(MultipartFile)完整流程 + 大文件分片上传思路
- 拦截器(HandlerInterceptor) vs 过滤器(Filter) vs AOP 的区别
- Spring Boot 如何自动配置 DispatcherServlet(WebMvcAutoConfiguration)
五、现代 Spring Boot 项目中常见的简化写法(2025–2026 风格)
@RestController
@RequestMapping("/api/v1/orders")
@RequiredArgsConstructor
public class OrderController {
private final OrderService orderService;
@PostMapping
public ApiResult<OrderVO> createOrder(
@Valid @RequestBody OrderCreateDTO dto,
@AuthenticationPrincipal UserPrincipal user) {
return ApiResult.success(orderService.create(dto, user.getId()));
}
@GetMapping("/{id}")
public ApiResult<OrderDetailVO> getOrderDetail(
@PathVariable Long id,
@RequestHeader(value = "X-Trace-Id", required = false) String traceId) {
return ApiResult.success(orderService.getDetail(id));
}
@ExceptionHandler(OrderNotFoundException.class)
public ResponseEntity<ApiResult<?>> handleOrderNotFound(OrderNotFoundException ex) {
return ResponseEntity.status(404)
.body(ApiResult.error("订单不存在", ex.getMessage()));
}
}
六、小结与进阶路线
Spring Web MVC 的外功核心在于:
- 理解 DispatcherServlet 是单例,所有请求都走它
- 掌握 HandlerMapping → Adapter → Controller → ViewResolver 这条主链路
- 搞清楚 参数绑定、消息转换、异常处理 三大扩展点
- 熟练使用 @ControllerAdvice、拦截器、过滤器 做统一处理
进阶学习顺序建议(2026 年推荐):
- 手写一次最简 DispatcherServlet(理解流程)
- 掌握 @ControllerAdvice + 全局异常 + 统一响应结构
- 深入 HttpMessageConverter + 自定义序列化(Jackson 配置)
- 实现文件分片上传 + 断点续传
- 学习 Spring Security + OAuth2 与 MVC 的集成
- 理解 WebFlux 与 MVC 的本质区别(响应式 vs 阻塞式)
重阳,你现在对 Spring MVC 最想补哪一块?
- 请求流程细节(源码级)
- 参数绑定与类型转换
- 异常处理体系
- 文件上传/下载完整方案
- 拦截器 vs Filter vs AOP 实战区别
- 还是直接来一道真实面试题拆解?
告诉我你的痛点或方向~