Spring aop切面编程

如何使用

@Aspect	// 1. 创建一个类,用@Aspect注解标记它,表明这是一个切面类。
@Component
public class LoggingAspect {

    // 2. 定义切点:在通知方法上,使用切点表达式来指定哪些方法将被拦截。
    // 切点表达式定义了你的通知将应用于哪些方法。
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceLayer() {}

    // 3. 定义通知:在切面类中,定义你的通知方法(前置通知、后置通知、返回后通知、异常通知、环绕通知),
    // 并使用相应的注解(@Before、@After、@AfterReturning、@AfterThrowing、@Around)标记。
    @Around("serviceLayer()")
    // ProceedingJoinPoint对象是JoinPoint的子接口,该对象只用在@Around的切面方法中
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        Object proceed = joinPoint.proceed(); // 执行目标方法
        return proceed;
    }
}

通知是根据其类型,在切点指定的连接点(Join point)的内容执行的特定时间点执行的,主要的通知类型及其执行时机:

  1. 前置通知(Before advice):在切点指定的方法执行之前执行。
  2. 后置通知(After advice):在切点指定的方法执行之后执行,无论方法执行成功还是异常结束。⚠️ after注解的通知方法会在finally里,一定会执行。
  3. 返回后通知(After-returning advice):在切点指定的方法成功执行之后执行。
  4. 异常后通知(After-throwing advice):在切点指定的方法抛出异常后执行。
  5. 环绕通知(Around advice):在切点指定的方法执行前后都可以执行,甚至可以决定是否执行目标方法。

如果切点已有,可以隐式定义切点:

@After(value = "execution(public * mapper.*.delete*(..))")	
// 切点:mapper目录下的所有的delete开头的public方法
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        Object proceed = joinPoint.proceed(); // 执行目标方法
        return proceed;
    }

利用@AuditAction创建切入点

@AuditAction 注解用于标记在需要进行审计日志记录的方法上,通过指定操作类型和目标表来描述该方法的行为。这种标记方式为 AOP 提供了一个“切入点”(Pointcut),使得 AOP 可以识别出哪些方法需要进行特定的处理。

假设有一个切面 ChangeLogAop,它通过 AOP 拦截所有标记了 @AuditAction 的方法,并根据注解中的信息执行相应的日志记录操作:

@Aspect
@Component
public class ChangeLogAop {

    // 拦截标记了 @AuditAction 注解的方法
    @After(value = "@annotation(auditAction)", argNames = "joinPoint,auditAction")
    public void doAudit(JoinPoint joinPoint, AuditAction auditAction) {
        // 根据 auditAction 中的信息(如操作类型和目标表)执行日志记录等操作
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值