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 ,可以让事务在遇到⾮运⾏时异常时也回滚。