关于Spring 基于注解的AOP通知执行顺序

网上的一些教程,大多数是拿Spring4.x 跟5.x来对比,其实 这几个通知顺序是从Spring版本为5.2.7.RELEASE---SpringBoot版本为2.2.8.RELEASE时 AOP执行顺序才发生的改变。

Aop常用注解

  • @Before 前置通知:目标方法之前执行
  • @After 后置通知:目标方法之后执行(始终执行)
  • @AfterReturning 返回后通知,执行方法结束前执行执行(异常不执行)
  • @AfterThrowing 异常通知:出现异常时执行
  • @Around 环绕通知 环绕目标方法执行

新建一个切面类MyAspect并为切面类新增两个注解

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyAspect {

    @Before("execution(public int com.iuvya.demo.controller.CalcServiceImpl.*(..))")
    public void beforeN() {
        System.out.println("@Before前置通知");
    }

    @After("execution(public int com.iuvya.demo.controller.CalcServiceImpl.*(..))")
    public void afterN() {
        System.out.println("@After后置通知");
    }

    @AfterReturning("execution(public int com.iuvya.demo.controller.CalcServiceImpl.*(..))")
    public void afterReturningN() {
        System.out.println("@AfterReturning返回后通知");
    }

    @AfterThrowing("execution(public int com.iuvya.demo.controller.CalcServiceImpl.*(..))")
    public void afterThrowingN() {
        System.out.println("@AfterThrowing异常通知");
    }

    @Around("execution(public int com.iuvya.demo.controller.CalcServiceImpl.*(..))")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object retVal = null;
        System.out.println("@Around 环绕通知前");
        proceedingJoinPoint.proceed();
        System.out.println("@Around 环绕通知后");
        return retVal;
    }
}

Spring版本为5.2.7.RELEASE之前:

正常情况:
@Around 环绕通知前
@Before前置通知
result:5
@Around 环绕通知后
@After后置通知
@AfterReturning返回后通知

异常情况:
@Around 环绕通知前
@Before前置通知
@After后置通知
@AfterThrowing异常通知

Spring版本为5.2.7.RELEASE之后:

正常情况:
@Around 环绕通知前
@Before前置通知
result:5
@AfterReturning返回后通知
@After后置通知
@Around 环绕通知后

异常情况:
@Around 环绕通知前
@Before前置通知
@AfterThrowing异常通知
@After后置通知

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值