介绍下 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:上传、国际化等专项能力。
架构视角:这套组件本质是一条可插拔的处理管线,每个环节都是策略模式扩展点——平台团队通过替换或追加组件(自定义转换器、参数解析器)实现全公司统一行为,这是框架能力的正确打开方式。
💻 全栈开发专家
按一次请求流记住这些组件:
- DispatcherServlet:前端控制器,唯一入口,
doDispatch编排全局 - HandlerMapping:URL → handler 映射(
RequestMappingHandlerMapping处理@RequestMapping) - HandlerAdapter:适配执行 handler,参数解析、返回值处理都在这(一堆
HandlerMethodArgumentResolver) - HandlerInterceptor:拦截器三回调
- HandlerExceptionResolver:异常解析(
@ControllerAdvice的载体) - ViewResolver:逻辑视图 → View(前后端分离下基本退休)
- HttpMessageConverter:请求/响应体序列化(Jackson)
- LocaleResolver:国际化;MultipartResolver:文件上传
调试与扩展都建立在这套组件上:比如自定义参数解析器——@CurrentUser 注入登录用户,就是实现 HandlerMethodArgumentResolver 注册到 WebMvcConfigurer#addArgumentResolvers;想看一次请求的完整映射与拦截器,从 Actuator 或上下文里把 RequestMappingHandlerMapping 捞出来打印 registry。
我的记忆口诀:一个 Servlet 收、两个 Mapping/Adapter 找和调、异常/视图/转换三个 Resolver 兜。能把组件和扩展点对应起来答,比背清单高一档。