spring boot aop advice执行顺序的坑

使用的demo参考这个博客https://blog.csdn.net/wangyijie521/article/details/84951558

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

import java.util.Arrays;

/**
 * @author linsanity
 * @date 2020-09-08 17:37
 * @desc
 */
//该注解表示声明该类为一个切面类
@Aspect
@Component
public class LogAspects {

    //定义一个切点,表达式可以灵活运用,我这个表达式是表示MathCalculator类中所有的方法都进行切入
    @Pointcut("execution(public int com.jdd.aggregation.controller.MathCalculator.*(..))")
    public void pointCut () {}

    //方法执行开始之前
    @Before("pointCut()")
    public void logStart (JoinPoint joinPoint) {
        System.out.println("除法运行...参数:{"+ Arrays.asList(joinPoint.getArgs())+"}");
    }

    //方法执行开始之后
    @After("pointCut()")
    public void logEnd (JoinPoint joinPoint) {
        System.out.println("除法结束..." + joinPoint.getSignature().getName());
    }

    //当方法进行返回的时候,returning属性是指定方法参数中的result来接收返回参数,这样就可以修改返回参数
    @AfterReturning(value = "pointCut()", returning = "result")
    public void logReturn (JoinPoint joinPoint, Object result) {
        System.out.println("除法正常返回... 返回结果:{"+result+"}");
    }

    //当方法执行异常的时候,throwding是指定方法参数中的e来接收异常参数,可以查看发生的什么异常
    @AfterThrowing(value = "pointCut()", throwing = "e")
    public void logException (JoinPoint joinPoint, Exception e) {
        System.out.println("异常... 异常信息:{"+e+"}");
    }

    //环绕通知
    @Around("pointCut()")
    public Object logAround (ProceedingJoinPoint joinPoint) throws Throwable {
        //原方法执行之前会打印这个日志
        System.out.println("环绕通知...  开始");
        //执行原方法
        Object obj = joinPoint.proceed();
        //原方法执行结束,打印这行日志
        System.out.println("环绕通知...  结束");
        //返回方法返回参数
        return obj;
    }
}
import org.springframework.stereotype.Service;

/**
 * @author linsanity
 * @date 2020-09-08 17:38
 * @desc
 */
@Service
public class MathCalculator {

    public int div (int i, int j) {
        System.out.println("MathCalculator.div...");
        return i / j;
    }
}

spring boot的版本1.5.9.RELEASE时,执行div方法打印如下:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

 

环绕通知...  开始
除法运行...参数:{[1, 1]}
MathCalculator.div...
环绕通知...  结束
除法结束...div
除法正常返回... 返回结果:{1}

 spring boot的版本2.3.3.RELEASE时,打印如下:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
环绕通知...  开始
除法运行...参数:{[1, 1]}
MathCalculator.div...
除法正常返回... 返回结果:{1}
除法结束...div
环绕通知...  结束

由上可见,不同的spring boot版本,对于advice执行的顺序是不同的。为何会出现这种情况,需要进一步查看代码。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值