对 Spring MVC 的理解
一、核心定位
Spring MVC 是 Spring 体系中专门处理 Web 层 的框架,核心思想遵循 MVC 设计模式:
- Model(模型):封装数据,通常指请求域中的对象
- View(视图):负责数据展示与页面渲染
- Controller(控制器):接收请求、协调处理、选择响应方式
二、最大的价值:前端控制器
Spring MVC 引入了一个核心组件 DispatcherServlet(前端控制器),本质是一个符合 Servlet 规范的 Servlet。所有请求先经过它,由它统一调度后续流程。
完整处理流程:
DispatcherServlet接收请求- 通过
HandlerMapping定位到具体的 Controller 方法 - 执行拦截器
preHandle(如果有) HandlerAdapter调用对应方法- 方法返回
ModelAndView或直接写回@ResponseBody数据 - 若返回视图,
ViewResolver解析为具体视图技术并渲染 - 执行拦截器
postHandle、afterCompletion
得益于此,开发者只需在方法上加 @RequestMapping 注解就能完成 URL 映射,底层映射关系在启动时已被扫描并存储好。
三、MVC 三层 vs. 应用分层
需要区分两个概念:Spring MVC 内部的 MVC 三层 ,以及 Spring 应用整体的分层架构。
3.1 Spring MVC 内部的 MVC
| 角色 | 职责 |
|---|---|
| Model | 承载数据(如请求域对象) |
| View | 视图解析与页面渲染 |
| Controller | 处理请求参数、调用业务逻辑、选择视图或返回数据 |
这是 Spring MVC 框架本身的职责边界,仅限 Web 层。
3.2 Spring 应用整体的分层(常见实践)
在 Spring 体系中,MVC 的三层被进一步细化,形成经典的四层架构:
-
Controller 层(Web 层)
- 接收 HTTP 请求
- 参数校验、数据绑定
- 调用 Service 层处理业务
- 返回视图或 JSON 数据
-
Service 层(业务逻辑层)
- 处理核心业务逻辑
- 事务控制通常加在这一层
- 协调多个 DAO 操作,保证业务原子性
-
DAO 层(数据访问层)
- 与数据库交互,执行 SQL
- 封装增删改查操作
-
View 层(视图层)
- 传统模式:使用 JSP、Thymeleaf 等进行服务端渲染
- 前后端分离模式:View 前移到前端框架(Vue/React),后端通过
@RestController直接返回 JSON,不再走ViewResolver渲染流程,View 的职责由前端承担
四、前后端分离带来的变化
- 传统 MVC:后端负责组装数据、调用视图渲染页面,最终返回完整 HTML
- 前后端分离 :Spring MVC 的 View 层概念被弱化,Controller 通过
HttpMessageConverter将对象序列化为 JSON 直接写入 Response Body,不经过视图解析 - 本质理解:View 层职责移交前端,Spring MVC 专注于提供 RESTful API,扮演"数据提供者"角色
五、总结
- Spring MVC 是基于 Servlet 的 Web 框架,核心是前端控制器
DispatcherServlet - 框架内部遵循 Model-View-Controller 三分,职责限定在 Web 层
- Service、DAO 属于 Spring 整体应用分层,不应直接归为"Spring MVC 的分层"
- 事务控制在 Service 层是推荐实践
- 前后端分离场景下,View 概念前移,Spring MVC 更侧重 API 化数据返回