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 ,可以让事务在遇到⾮运⾏时异常时也回滚。
相关推荐
予枫的编程笔记13 分钟前
【面试专栏|Java并发编程】CAS 核心原理,优缺点,ABA问题与解决方案
java·并发编程·java面试·java并发·aba问题·cas原理·面试干货
老前端的功夫34 分钟前
【Java从入门到入土】06:String的72变:从字符串拼接到底层优化
java·开发语言
又是忙碌的一天40 分钟前
Java 面向对象三大特性:封装、继承、多态深度解析
java·前端·python
隔壁小邓1 小时前
在Java中实现优雅的CQRS架构
java·开发语言·架构
河边小咸鱼1 小时前
pdd校招实习生内推【实时更新链接】2027届实习、2026届春招
java·c++·golang
zzb15801 小时前
Agent学习-Reflection框架
java·人工智能·python·学习·ai
Holen&&Beer1 小时前
Spring-Profile与部署说明
java·后端·spring
棉花糖超人1 小时前
【操作系统】三、线程
java·开发语言·操作系统
liuyao_xianhui1 小时前
优选算法_判断字符是否唯一_C++
java·开发语言·数据结构·c++·算法·链表
代码雕刻家1 小时前
3.4.Maven-idea集成-导入Maven项目
java·maven·intellij-idea