Spring MVC架构与请求处理流程详解
Spring MVC架构与请求处理流程详解定位第 01 篇讲透 MVC 设计模式、各核心组件职责、一次请求的完整处理链路与 DispatcherServlet 装配适用版本Spring Framework 6.xJDK 17目录一、MVC 模式二、核心组件三、请求处理链路四、DispatcherServlet 装配五、总结六、常见高频面试题一、MVC 模式1.1 三角色角色职责在 Spring MVC 中Model数据与业务状态方法返回的数据/Model 对象View呈现模板Thymeleaf或 JSONRESTController接收请求、编排、返回Controller/RestController 方法1.2 价值职责分离请求入口Controller与业务、呈现解耦视图可替换同一数据渲染 HTML 或 JSONController 薄、逻辑下沉到 Service便于测试。浏览器/客户端 → Controller编排 → Service业务 → Model ↓ View/JSON 呈现二、核心组件理解这六个组件就理解了 Spring MVC组件职责可定制DispatcherServlet前端控制器所有请求统一入口可多个、可换映射HandlerMappingURL → Handler找到处理方法可加自定义HandlerAdapter适配并调用 Handler解析注解、参数主要用 RequestMappingHandlerAdapterHandler你的 RequestMapping 方法业务代码ViewResolver视图名 → View传统 MVCREST 场景不用HttpMessageConverter对象 ↔ 请求/响应报文JSON/XML 转换器前端控制器模式所有请求经 DispatcherServlet 统一分发避免每个资源各自处理入口逻辑——这是 MVC 框架的通用骨架。三、请求处理链路一次请求的完整流程面试必背① 请求到达 DispatcherServlet │ ② HandlerMapping 匹配根据 URL 找到 Handler处理方法 拦截器链 │ ③ HandlerAdapter 准备调用解析方法参数RequestParam/RequestBody 等见 02 篇 │ ④ 执行 Handler你的业务方法 │ ⑤ 处理返回值 ├── 传统返回视图名 → ViewResolver 解析 → View 渲染 └── RESTResponseBody → HttpMessageConverter 序列化为 JSON │ ⑥ 响应写回客户端 │ 异常任意环节抛异常 → HandlerExceptionResolver 处理见 04 篇关键认知Handler 是方法不是类HandlerMapping 定位到具体的 RequestMapping 方法REST 与传统共用同一链路差异只在第⑤步消息转换 vs 视图渲染拦截器在②③之间执行04 篇展开。四、DispatcherServlet 装配4.1 Boot 下的自动装配WebMvcAutoConfiguration自动注册 DispatcherServlet映射到/并装配默认的 HandlerMapping、HandlerAdapter、消息转换器。4.2 上下文结构DispatcherServlet 持有一个WebApplicationContextServlet 级通常以根容器Root Context业务 Bean为父——子容器可见父容器 Bean反之不行。Boot 中两者合一这个分层在理解 XML 时代遗留项目时仍重要。4.3 多 Servlet 场景默认一个 DispatcherServlet/ 可注册多个各自不同 url-pattern如 /app/*、/admin/* 每个有独立的 WebApplicationContext五、总结MVCModel/View/Controller 职责分离Controller 薄、逻辑下沉。六大组件DispatcherServlet 统一入口、HandlerMapping 找方法、HandlerAdapter 解析调用、Handler 业务方法、ViewResolver/HttpMessageConverter 处理输出。请求链路到达 → 映射 → 参数解析 → 执行 → 结果处理视图或 JSON→ 写回异常交异常解析器。装配Boot 自动注册映射 /理解 Web 上下文父子结构多 Servlet 各自独立上下文。六、常见高频面试题1. 描述一次请求在 Spring MVC 中的完整处理流程。要点请求到达 DispatcherServlet → HandlerMapping 按 URL 匹配到 HandlerRequestMapping 方法与拦截器链 → HandlerAdapter 解析方法参数并调用 → Handler 执行业务返回 → 处理返回值传统走 ViewResolver 渲染视图RESTResponseBody走 HttpMessageConverter 序列化为 JSON → 写回响应。任意环节异常交 HandlerExceptionResolver 处理。2. DispatcherServlet 是什么为什么叫前端控制器要点它是 Spring MVC 的统一请求入口所有请求先到它再由它分发给具体 Handler——这是前端控制器Front Controller模式集中处理入口逻辑映射、参数解析、异常、视图避免每个资源各自实现。好处是流程统一、横切能力拦截、安全、日志有统一挂载点。Boot 自动装配它映射到 /。3. HandlerMapping 和 HandlerAdapter 的区别要点HandlerMapping 负责找——根据请求URL/注解定位到具体的 Handler 及其拦截器链HandlerAdapter 负责调——适配并调用 Handler解析方法参数、处理返回值RequestParam/RequestBody 等由它驱动。常用实现RequestMappingHandlerMapping处理 RequestMapping与 RequestMappingHandlerAdapter。分离二者使框架可扩展不同的处理器风格。4. Controller 和 RestController 的区别要点RestController Controller ResponseBody。Controller 的方法默认返回视图名交给 ViewResolver 渲染RestController 的方法返回值直接经 HttpMessageConverter 序列化为响应体通常 JSON用于 REST API。需要部分方法返回视图、部分返回 JSON时用 Controller 局部 ResponseBody。5. HttpMessageConverter 的作用常见有哪些要点负责对象与 HTTP 报文之间的双向转换——把请求体反序列化为方法参数RequestBody把返回值序列化为响应体ResponseBody。常见MappingJackson2HttpMessageConverterJSON、StringHttpMessageConverter字符串、FormHttpMessageConverter表单、XML 转换器等。内容协商Accept/Content-Type决定选哪个转换器。6. 什么是内容协商要点根据请求与响应头协商数据格式。请求侧Content-Type 声明请求体格式决定反序列化用哪个转换器响应侧Accept 声明客户端期望格式服务端结合可用的 HttpMessageConverter 与扩展名/参数决定返回 JSON 还是 XML 等。Boot 默认以 JSON 为主。这让同一接口可服务不同格式的客户端。7. REST 风格和传统 MVC 在链路上的差异在哪要点前四步完全一致映射、参数解析、执行。差异在返回值处理传统返回视图名经 ViewResolver 解析成 View 再渲染模型数据REST 用 ResponseBody或 RestController返回值直接经 HttpMessageConverter 序列化为报文写回。所以 REST 是 MVC 链路的一种输出形态不是另一套框架。8. Spring MVC 的父子容器是怎么回事要点传统结构有根容器RootService/DAO 等业务 Bean与 DispatcherServlet 的 Web 子容器Controller 等 Web Bean子可见父、父不可见子避免 Web 层污染业务层。Boot 中合并为单一容器不再区分。理解它有助于维护老的 XML 项目和解释某些 Bean 可见性问题。9. 如何自定义 HandlerMapping 或加多个要点实现 HandlerMapping 接口并注册为 BeanDispatcherServlet 启动时收集所有 HandlerMapping 按 order 排序请求到来时依次尝试直到匹配。可用于自定义路由规则如基于版本头的路由。常见扩展点还包括自定义 HandlerAdapter、HandlerInterceptor。不过多数场景用 RequestMapping 注解驱动即可无需自定义。10. 为什么 Spring MVC 是同步阻塞模型有什么影响要点基于 Servlet 规范默认每个请求占用一个线程从入口到响应结束阻塞式处理含等待下游/DB 的时间。影响高并发下线程数成为吞吐瓶颈线程被 IO 等待占用而非干活。对策扩大线程池治标、异步方法释放线程部分缓解、或换响应式栈WebFlux06 篇与异步 Servlet。虚拟线程JDK 21也在改变这一模型的代价。