Skip to content

介绍下 Spring MVC 的核心组件? ​

  • 标签:后端、Spring

🏛 业务架构师 ​

Spring MVC 的核心组件沿请求链路数下来:

  • DispatcherServlet:前端控制器,所有请求的统一入口和调度中枢;
  • HandlerMapping:URL + HTTP 方法 → 目标 Handler(含拦截器链)的映射;
  • HandlerAdapter:适配执行 Handler,参数绑定、@RequestBody 反序列化、数据校验都发生在这一环;
  • Handler(Controller):业务入口;
  • HandlerInterceptor:拦截器,横切鉴权、日志、上下文注入;
  • HttpMessageConverter:对象与 JSON/XML 报文互转(@ResponseBody 的作用点);
  • ViewResolver / View:视图解析渲染(前后端分离时代已边缘化);
  • HandlerExceptionResolver:统一异常处理出口。

架构师视角,记组件的真正价值是知道治理规范该挂在哪里:

  • 统一鉴权、租户上下文 → HandlerInterceptor(进 Controller 前完成);
  • 全局错误码与告警分级 → HandlerExceptionResolver / @RestControllerAdvice;
  • 序列化规范(日期格式、Long 转字符串、脱敏)→ 定制 HttpMessageConverter;
  • 请求日志与 traceId → 最外层 Filter + 拦截器配合。

一次面试加分表达:"我们公司的 API 治理规范全部沉在这条链的标准挂载点上,业务开发无感遵守"——组件是骨架,治理点位的规划才是架构师对 MVC 的真正使用。

🏗 系统架构师 ​

按一条请求的生命周期列:

  • DispatcherServlet:前端控制器,唯一汇聚点;
  • HandlerMapping:URL 到 Handler 的映射(RequestMappingHandlerMapping 解析注解元数据);
  • HandlerAdapter:适配执行不同形态的处理器——解耦 DispatcherServlet 与 Handler 类型,新处理器形态只需新增 Adapter;
  • HandlerInterceptor:横切拦截(pre/post/afterCompletion);
  • HandlerExceptionResolver:异常解析,@ExceptionHandler 的承载者;
  • ViewResolver/View:逻辑视图名到视图的解析(前后端分离下退位于 JSON 转换);
  • HttpMessageConverter:body 序列化与反序列化;
  • HandlerMethodArgumentResolver/ReturnValueHandler:参数绑定与返回值处理;
  • MultipartResolver/LocaleResolver:上传、国际化等专项能力。

架构视角:这套组件本质是一条可插拔的处理管线,每个环节都是策略模式扩展点——平台团队通过替换或追加组件(自定义转换器、参数解析器)实现全公司统一行为,这是框架能力的正确打开方式。

💻 全栈开发专家 ​

按一次请求流记住这些组件:

  1. DispatcherServlet:前端控制器,唯一入口,doDispatch 编排全局
  2. HandlerMapping:URL → handler 映射(RequestMappingHandlerMapping 处理 @RequestMapping)
  3. HandlerAdapter:适配执行 handler,参数解析、返回值处理都在这(一堆 HandlerMethodArgumentResolver)
  4. HandlerInterceptor:拦截器三回调
  5. HandlerExceptionResolver:异常解析(@ControllerAdvice 的载体)
  6. ViewResolver:逻辑视图 → View(前后端分离下基本退休)
  7. HttpMessageConverter:请求/响应体序列化(Jackson)
  8. LocaleResolver:国际化;MultipartResolver:文件上传

调试与扩展都建立在这套组件上:比如自定义参数解析器——@CurrentUser 注入登录用户,就是实现 HandlerMethodArgumentResolver 注册到 WebMvcConfigurer#addArgumentResolvers;想看一次请求的完整映射与拦截器,从 Actuator 或上下文里把 RequestMappingHandlerMapping 捞出来打印 registry。

我的记忆口诀:一个 Servlet 收、两个 Mapping/Adapter 找和调、异常/视图/转换三个 Resolver 兜。能把组件和扩展点对应起来答,比背清单高一档。