Interceptor, 事务管理, AOP

本贴最后更新于 314 天前,其中的信息可能已经时移俗易
过滤器与拦截器的区别

接口规范不同:过滤器需要实现 Filter 接口,而拦截器需要实现 HandlerInterceptor 接口。

拦截范围不同:过滤器 Filter 会拦截所有的资源,而 Interceptor 只会拦截 Spring 环境中的资源。

@RestControllerAdvice 注解的作用

表明是一个全局异常处理器

@ExceptionHandler 注解的作用

指定可以捕获哪种类型的异常进行处理

Spring 事务管理 - @Transactional 注解

注解: @Transactional

位置: 业务层的方法上, 类上, 接口上

作用: 将当前方法交给 spring 进行事务管理,方法执行前,开启事务; 成功执行完毕,提交事务; 出现异常,回滚事务

结论:在 Spring 的事务管理中,默认只有运行时异常 RuntimeException 才会回滚。
如果还需要回滚指定类型的异常,可以通过 rollbackFor​属性来指定。

事务属性 - 传播行为

@Transactional​ [默认值] 需要事务,有则加入,无则创建新事物

@Transactional(propagation = Propagation.REQUIRES_NEW)​ 需要新事务,无论有无,总是创建新事务

AOP 概述

AOP: Aspect Oriented Programming(面向切面编程, 面向方面编程), 就是面向特定方法编程

AOP 实现

动态代理是面向切面编程最主流的实现. 而 SpringAOP 是 Spring 框架的高级技术,旨在管理 bean 对象的过程中, 主要通过底层的动态代理机制, 对特定的方法进行编程

AOP 的优势
  • 代码无侵入
  • 减少重复代码
  • 提高开发效率
  • 维护方便
AOP 的作用

在程序运行期间在不修改源代码的基础上对已有方法进行增强(无侵入性: 解耦)

面向切面编程

面向指定的一个或多个方法进行编程, 称之为面向切面编程

@Aspect 注解的作用

当前类是一个切面类

AOP 的应用场景
  • 记录系统的操作日志
  • 权限控制
  • 事务管理
AOP 核心概念
  • 连接点: JoinPoint, 可以被 AOP 控制的方法
  • 通知: Advice, 指哪些重复的逻辑, 也就是共性功能
  • 切入点: PointCut, 匹配连接点的条件, 通知仅会切入点方法执行时被应用
  • 切面: Aspect, 描述通知与切入点的对应关系(通知 + 切入点)
  • 目标对象: Target, 通知所应用的对象
AOP 通知类型

@Around​: 环绕通知, 此注解标注的通知方法在目标方法前, 后都被执行

@Before​: 前置通知, 此注解标注的通知方法在目标方法前被执行

@After​: 后置通知, 此注解标注的通知方法后被执行, 无论是否有异常都会执行

@AfterReturning​: 返回后通知, 此注解标注的通知方法在目标方法后被执行, 有异常不会执行

@AfterThrowing​: 异常后通知, 此注解标注的通知方法发生异常后执行
如果程序没有发生异常的情况下, @AfterThrowing​标识的通知方法不会执行

程序发生异常的情况

@AfterReturning​标识的通知方法不会执行, @AfterThrowing​标识的通知方法执行了

@Around​环绕通知中原始方法调用时有异常, 通知中的环绕后的代码逻辑也不会执行了(因为原始方法调用已经出异常了)

使用通知时的注意事项

@Around​环绕通知需要自己调用 ProceedingJoinPoint.proceed()​来让原始方法执行, 其他通知不需要考虑目标方法执行

@Around​环绕通知方法的返回值必须指定为 Object 来接受原始方法的返回值, 否则原始方法执行完毕是获取不到返回值的

@PointCut 注解的作用

将公共的切入点表达式抽取出来, 需要用到时引用该切入点表达式即可.
当切入点方法使用 private​修饰时, 仅能在当前切面类中引用该表达式, 当外部其他切面类中也要引用当前类中的切入点表达式, 就需要把 private​改为 public​, 而在引用的时候, 具体的语法为: 全类名.方法名()

通知的执行顺序
  • 目标方法前的通知方法: 字母排名靠前的先执行
  • 目标方法后的通知方法: 字母排名靠前的后执行
控制通知的执行顺序的两种方法

修改切面类的类名(繁琐, 不便管理)

使用 Spring 提供的 @Order​注解

@Order 注解的作用

控制通知的执行顺序

切入点表达式

描述切入点方法的一种表达式

作用: 主要用来决定项目中的哪些方法需要加入通知

常见形式: execution()​: 根据方法的签名来匹配
@annotation()​: 根据注解匹配

@annotation
  • AOP
    21 引用 • 13 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    941 引用 • 1458 回帖 • 151 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...