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 ,可以让事务在遇到⾮运⾏时异常时也回滚。
相关推荐
LuckyLay14 分钟前
Spring学习笔记_34——@Controller
spring·controller
希忘auto15 分钟前
详解MySQL安装
java·mysql
冰淇淋烤布蕾26 分钟前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺33 分钟前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
Jakarta EE1 小时前
正确使用primefaces的process和update
java·primefaces·jakarta ee
马剑威(威哥爱编程)1 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
java—大象1 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计
ApiHug2 小时前
ApiSmart x Qwen2.5-Coder 开源旗舰编程模型媲美 GPT-4o, ApiSmart 实测!
人工智能·spring boot·spring·ai编程·apihug
杨哥带你写代码2 小时前
网上商城系统:Spring Boot框架的实现
java·spring boot·后端
camellias_2 小时前
SpringBoot(二十一)SpringBoot自定义CURL请求类
java·spring boot·后端