对Spring MVC 的理解

对 Spring MVC 的理解

一、核心定位

Spring MVC 是 Spring 体系中专门处理 Web 层 的框架,核心思想遵循 MVC 设计模式

  • Model(模型):封装数据,通常指请求域中的对象
  • View(视图):负责数据展示与页面渲染
  • Controller(控制器):接收请求、协调处理、选择响应方式

二、最大的价值:前端控制器

Spring MVC 引入了一个核心组件 DispatcherServlet(前端控制器),本质是一个符合 Servlet 规范的 Servlet。所有请求先经过它,由它统一调度后续流程。

完整处理流程:

  1. DispatcherServlet 接收请求
  2. 通过 HandlerMapping 定位到具体的 Controller 方法
  3. 执行拦截器 preHandle(如果有)
  4. HandlerAdapter 调用对应方法
  5. 方法返回 ModelAndView 或直接写回 @ResponseBody 数据
  6. 若返回视图,ViewResolver 解析为具体视图技术并渲染
  7. 执行拦截器 postHandleafterCompletion

得益于此,开发者只需在方法上加 @RequestMapping 注解就能完成 URL 映射,底层映射关系在启动时已被扫描并存储好。

三、MVC 三层 vs. 应用分层

需要区分两个概念:Spring MVC 内部的 MVC 三层 ,以及 Spring 应用整体的分层架构

3.1 Spring MVC 内部的 MVC
角色 职责
Model 承载数据(如请求域对象)
View 视图解析与页面渲染
Controller 处理请求参数、调用业务逻辑、选择视图或返回数据

这是 Spring MVC 框架本身的职责边界,仅限 Web 层

3.2 Spring 应用整体的分层(常见实践)

在 Spring 体系中,MVC 的三层被进一步细化,形成经典的四层架构:

  1. Controller 层(Web 层)

    • 接收 HTTP 请求
    • 参数校验、数据绑定
    • 调用 Service 层处理业务
    • 返回视图或 JSON 数据
  2. Service 层(业务逻辑层)

    • 处理核心业务逻辑
    • 事务控制通常加在这一层
    • 协调多个 DAO 操作,保证业务原子性
  3. DAO 层(数据访问层)

    • 与数据库交互,执行 SQL
    • 封装增删改查操作
  4. 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 化数据返回