spring-boot版本影响Spring AOP @Before @Around @After等执行顺序

news/2024/11/7 22:38:06/

郁闷了半天,我通过AOP切面打印的日志顺序怪怪的,网上查了好几篇文章都说没问题,最后发现是springboot版本升级后@Before @Around @After等执行顺序发生了变化。

1.切面类

@Aspect// 这是一个切面
@Component// 这是一个需要被装配的spring bean
@Slf4j
public class AopOrderAspecct {@Pointcut("execution(public void com.example.temp.aopOrder.*.*())")public void point() {}@Before("point()")public void before(JoinPoint joinPoint) {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();String methodName = methodSignature.getName();log.info("{}-执行before。。。", methodName);}@Around("point()")public void around(ProceedingJoinPoint joinPoint) {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();String methodName = methodSignature.getName();log.info("{}-进入around。。。", methodName);try {joinPoint.proceed();} catch (Throwable throwable) {log.error("{}-around内部方法执行失败:{}", methodName, throwable.getMessage());}log.info("{}-around执行完毕!", methodName);}@After("point()")public void after(JoinPoint joinPoint) {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();String methodName = methodSignature.getName();log.info("{}-执行after。。。", methodName);}@AfterReturning("point()")public void afterReturning(JoinPoint joinPoint) {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();String methodName = methodSignature.getName();log.info("{}-执行afterReturning。。。", methodName);}@AfterThrowing("point()")public void afterThrowing(JoinPoint joinPoint) {MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();String methodName = methodSignature.getName();log.info("{}-执行afterThrowing。。。", methodName);}
}

2.测试Service

@Component
@Slf4j
public class AopOrderServiceA {@ResourceAopOrderServiceB serviceB;public void aopOrderA() {log.info("aopOrderA-进入方法。。。");int x = 0/0;serviceB.aopOrderB();log.info("aopOrderA-方法执行完毕!");}}@Component
@Slf4j
public class AopOrderServiceB {public void aopOrderB() {log.info("aopOrderB-进入方法。。。");
//        int x = 0/0;log.info("aopOrderB-方法执行完毕!");}
}

3.单元测试

@SpringBootTest
@RunWith(SpringRunner.class)
public class OrderServiceTest {@ResourceAopOrderService aopOrderService;@Testpublic void testOrder() {String springVersion = SpringVersion.getVersion();String bootVersion = SpringBootVersion.getVersion();log.info("spring:{},springBoot:{}", springVersion, bootVersion);aopOrderService.aopOrder();}
}

4.springboot不同版本的结果

springboot版本 2.3.1.RELEASE 之前,after在around之后执行, 2.3.1.RELEASE 及之后,around包裹整个切面执行周期。

spring boot 版本为 2.0.0.RELEASE

spring:5.0.4.RELEASE,springBoot:2.0.0.RELEASE
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderA-方法执行完毕!
aopOrderA-around执行完毕!
aopOrderA-执行after。。。
aopOrderA-执行afterReturning。。。

spring boot 版本为 2.1.0.RELEASE

spring:5.1.2.RELEASE,springBoot:2.1.0.RELEASE
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderA-方法执行完毕!
aopOrderA-around执行完毕!
aopOrderA-执行after。。。
aopOrderA-执行afterReturning。。。

spring boot 版本为 2.2.0.RELEASE

spring:5.2.0.RELEASE,springBoot:2.2.0.RELEASE
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderA-方法执行完毕!
aopOrderA-around执行完毕!
aopOrderA-执行after。。。
aopOrderA-执行afterReturning。。。

spring boot 版本为 2.3.0.RELEASE

spring:5.2.6.RELEASE,springBoot:2.3.0.RELEASE
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderA-方法执行完毕!
aopOrderA-around执行完毕!
aopOrderA-执行after。。。
aopOrderA-执行afterReturning。。。

spring boot 版本为 2.3.1.RELEASE(从这里开始不一样)

spring:5.2.7.RELEASE,springBoot:2.3.1.RELEASE
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderA-方法执行完毕!
aopOrderA-执行afterReturning。。。
aopOrderA-执行after。。。
aopOrderA-around执行完毕!// 注意,这里不同

spring boot 版本为2.7.0(目标方法执行抛出异常时)

spring:5.3.20,springBoot:2.7.0
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderA-执行afterThrowing。。。// 注意,这里不同
aopOrderA-执行after。。。
aopOrderA-around内部方法执行失败:/ by zero
aopOrderA-around执行完毕!

当目标方法切面嵌套时

spring:5.3.20,springBoot:2.7.0
aopOrderA-进入around。。。
aopOrderA-执行before。。。
aopOrderA-进入方法。。。
aopOrderB-进入around。。。
aopOrderB-执行before。。。
aopOrderB-进入方法。。。
aopOrderB-方法执行完毕!
aopOrderB-执行afterReturning。。。
aopOrderB-执行after。。。
aopOrderB-around执行完毕!
aopOrderA-方法执行完毕!
aopOrderA-执行afterReturning。。。
aopOrderA-执行after。。。
aopOrderA-around执行完毕!
aopOrderA-方法执行完毕!
aopOrderA-执行afterReturning。。。
aopOrderA-执行after。。。
aopOrderA-around执行完毕!

流程图

在这里插入图片描述


参考连接:
https://blog.csdn.net/weixin_44005802/article/details/127014570
https://blog.csdn.net/lgxzzz/article/details/100026524


http://www.ppmy.cn/news/142818.html

相关文章

基于Jackson实现API接口数据脱敏

一、背景 用户的一些敏感数据,例如手机号、邮箱、身份证等信息,在数据库以明文存储(加密存储见《基于Mybatis-Plus拦截器实现MySQL数据加解密》), 但在接口返回数据给浏览器(或三方客户端)时&a…

ORA-39001

oracle 11g执行expdp导出脚本时报错&#xff1a; ORA-39001:参数值无效 ORA-39000:转储文件说明错误 ORA-31641:无法创建转储文件“xxxxx.dmp" ORA-27038:所创建的文件已存在 OSD-04010&#xff1a;?????<create>??,?????????? 解决方式&#xf…

ORA-39002 ORA-39168

impdp导入报错ORA-39002 ORA-39168 $ impdp \/ as sysdba\ parfileimpdp.par Import: Release 11.2.0.4.0 - Production on Fri Apr 16 10:57:13 2021Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.Connected to: Oracle Database 11g Ente…

VS-RK3399性能介绍

VS-RK3399采用6核64位处理器&#xff0c;主频1.8Ghz。GPU采用Mali-T860 GPU, OpenGL ES1.1/2.0/3.0/3.1, OpenVG1.1, OpenCL,DX11等规范。 搭载嵌入式Android 7.1版本系统,板载DDR3 2GB内存, 并可支持3G/4G通信模块扩展&#xff0c;HDMIEDPMIPI显示输出(支持1080P) 板载16GB NA…

DFB激光器电流温度与波长的关系

电流增加&#xff0c;波长增加&#xff0c;温度电压增加&#xff0c;温度降低&#xff0c;波长减小 图里面是温度的电压&#xff0c;不是温度&#xff0c;所以随着温度电压&#xff08;热敏电阻电压&#xff09;的增大&#xff0c;温度降低&#xff0c;波长减小 DFB激光器-北京…

rtx3090显卡什么级别 rtx3090显卡什么水平 3090属于什么档次的显卡

3090是最强显卡 3090全称&#xff1a;RTX 3090显卡&#xff0c;2020年9月2日正式发布。搭载24GB GDDR6X显存&#xff0c;采用三插槽体积&#xff0c;双轴流线型散热器设计。rtx3090怎么样这些点很重要 http://www.adiannao.cn/dq 2、RTX 3090显卡与上一代RTX 3080显卡对比&…

NVIDIA GeForce GT 730 配置 CUDA

1.下 cuda toolkit 8.0 CUDA Toolkit 8.0 GA1 Download | NVIDIA Developer 2.下 cuDNN 6.0 cuDNN Archive | NVIDIA Developer 3. 把 cuDNN 里的 bin、include、lib 里的东西放到 C:Program FilesNVIDIA GPU Computing ToolkitCUDAv8.0 相应文件夹里 4. 5. conda instal…

R中报错Error in idx[i, ] <- res[[i]][[1]] : number of items to replace is not a multiple of

运行predictions.assay <- TransferData(anchorset anchors, refdata allen_reference$cell_type, prediction.assay TRUE, weight.reduction ca_6[["pca"]], dims 1:30)时 报错Error in idx[i, ] <- res[[i]][[1]] : n…