Spring MVC

Spring MVC

MVC定义

  • MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核⼼思想是通过将业务逻辑、数据、显示分离来组织代码
  • MVC 是⼀种设计模式, Spring MVC 是⼀款很优秀的 MVC 框架。 Spring MVC 可以帮助我们进⾏更简洁的 Web 层的开发,并且它天⽣与 Spring 框架集成。 Spring MVC 下我们⼀般把后端项⽬分为Service 层(处理业务)、 Dao 层(数据库操作)、 Entity 层(实体类)、 Controller 层(控制层,返回数据给前台⻚⾯)。

Spring MVC 的核⼼组件有哪些?

  • DispatcherServlet : 核⼼的中央处理器,负责接收请求、分发,并给予客户端响应。
  • HandlerMapping : 处理器映射器,根据 uri 去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler ⼀起封装。
  • HandlerAdapter : 处理器适配器,根据 HandlerMapping 找到的 Handler ,适配执⾏对应的Handler ;Handler : 请求处理器,处理实际请求的处理器。
  • ViewResolver : 视图解析器,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端

SpringMVC ⼯作原理了解吗?

  • 客户端(浏览器)发送请求, DispatcherServlet 拦截请求。
  • DispatcherServlet 根据请求信息调⽤ HandlerMapping 。 HandlerMapping 根据 uri 去匹配查找能处理的 Handler (也就是我们平常说的 Controller 控制器) ,并会将请求涉及到的拦截器和Handler ⼀起封装。
  • DispatcherServlet 调⽤ HandlerAdapter 适配执⾏ Handler 。
  • Handler 完成对⽤户请求的处理后,会返回⼀个 ModelAndView 对象给DispatcherServlet , ModelAndView 顾名思义,包含了数据模型以及相应的视图的信息。 Model 是返回的数据对象, View 是个逻辑上的 View 。
  • ViewResolver 会根据逻辑 View 查找实际的 View 。
  • DispaterServlet 把返回的 Model 传给 View (视图渲染)。
  • 把 View 返回给请求者(浏览器)

统⼀异常处理怎么做?

  • 推荐使⽤注解的⽅式统⼀异常处理,具体会使⽤到 @ControllerAdvice + @ExceptionHandler 这两个注解 。
  • 这种异常处理⽅式下,会给所有或者指定的 Controller 织⼊异常处理的逻辑(AOP),当
    Controller 中的⽅法抛出异常的时候,由被 @ExceptionHandler 注解修饰的⽅法进⾏处理。
  • ExceptionHandlerMethodResolver 中 getMappedMethod ⽅法决定了异常具体被哪个被@ExceptionHandler 注解修饰的⽅法处理异常

Spring 管理事务的⽅式有⼏种

  • 编程式事务 : 在代码中硬编码(不推荐使⽤) : 通过 TransactionTemplate 或者
    TransactionManager ⼿动管理事务,实际应⽤中很少使⽤,但是对于你理解 Spring 事务管理原理有帮助。
  • 声明式事务 : 在 XML 配置⽂件中配置或者直接基于注解(推荐使⽤) : 实际是通过 AOP 实现(基于 @Transactional 的全注解⽅式使⽤最多)

Spring 事务中哪⼏种事务传播⾏为?

事务传播⾏为是为了解决业务层⽅法之间互相调⽤的事务问题

正确的事务传播⾏为可能的值如下:

  • TransactionDefinition.PROPAGATION_REQUIRED
    使⽤的最多的⼀个事务传播⾏为,我们平时经常使⽤的 @Transactional 注解默认使⽤就是这个事务传播⾏为。如果当前存在事务,则加⼊该事务;如果当前没有事务,则创建⼀个新的事务。
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW
    创建⼀个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部⽅法是否开启事
    务, Propagation.REQUIRES_NEW 修饰的内部⽅法会新开启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰。
  • TransactionDefinition.PROPAGATION_NESTED
    如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏;如果当前没有事务,则该取值等价于 TransactionDefinition.PROPAGATION_REQUIRED 。
  • TransactionDefinition.PROPAGATION_MANDATORY
    如果当前存在事务,则加⼊该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)

若是错误的配置以下 3 种事务传播⾏为,事务将不会发⽣回滚:

  • TransactionDefinition.PROPAGATION_SUPPORTS : 如果当前存在事务,则加⼊该事务;如果当前没有事务,则以⾮事务的⽅式继续运⾏。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED : 以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NEVER : 以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常。

@Transactional(rollbackFor = Exception.class)注解了解吗

  • Exception 分为运⾏时异常 RuntimeException 和⾮运⾏时异常。事务管理对于企业应⽤来说是⾄关重要的,即使出现异常情况,它也可以保证数据的⼀致性。
  • 当 @Transactional 注解作⽤于类上时,该类的所有 public ⽅法将都具有该类型的事务属性,同时,我们也可以在⽅法级别使⽤该标注来覆盖类级别的定义。如果类或者⽅法加了这个注解,那么这个类⾥⾯的⽅法抛出异常,就会回滚,数据库⾥⾯的数据也会回滚。
  • 在 @Transactional 注解中如果不配置 rollbackFor 属性,那么事务只会在遇到 RuntimeException 的时候才会回滚,加上 rollbackFor=Exception.class ,可以让事务在遇到⾮运⾏时异常时也回滚。
相关推荐
秋饼9 分钟前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff1 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff2 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
SL_staff3 小时前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品
nice_lcj5203 小时前
【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端
java·后端·spring·spring ai·ai应用开发
桦说编程4 小时前
TransmittableThreadLocal 解读:从 CRR 机制到上下文所有权
java·后端·源码
xys_6785 小时前
JavaEE通关手册:初识Java
java·开发语言
文丑颜不良啊5 小时前
LeetCode2461~2480题目解析
java·leetcode
文丑颜不良啊6 小时前
LeetCode2441~2460题目解析
java·leetcode
阿屿7 小时前
从零手搓 AI 伴侣(二):好感度通胀危机,与它的「货币政策」
java·人工智能