Spring Aop的@After和@AfterReturning在不同版本中的顺序问题解析

Spring Aop的@After和@AfterReturning在不同版本中的执行顺序问题解析

相同的帖子千篇一律,手打的内容万里挑一。
转载请标明出处。

最近发现spring在5.2.19.RELEASE 版本中aop的执行顺序出现了问题 AfterReturning 在 After之前进行了执行,又去试了下 5.2.6的版本发现是没有问题的,然后跟了下源码发下了原因如下:
一、出现的问题
1、当定义好如下的aop时
在这里插入图片描述
2、运行后发现 After竟然在AfterReturning 之后执行了
在这里插入图片描述
根据该问题,去看了源码,开始考虑的是排序的问题,就去了创建代理之前获取advisor的地方,这里先简单说下因为aop创建代理调用逻辑问题,正常情况下advisor的排序的倒序排列的 也就是
1.AfterThrowing 2.AfterReturning 3.After 4.Before 这样的顺序,这里就先不具体讲解为什么这么做了。
这是排序方法前当前advisor的顺序
在这里插入图片描述
执行排序方法后advisor的顺序
在这里插入图片描述
结果发现了advisor的顺序并没有变化,那说明排序出现了问题,跟到排序方法sortAdvisors中后发现排序使用的是 declarationOrder字段
在这里插入图片描述
查看当前所有的advisor后发现 所有的 declarationOrder都是0那么就是这个参数有问题
在这里插入图片描述
由于declarationOrder是解析advisor时赋值的我们去看解析的逻辑后发现有这么一段发现构建是传递的都是0,所以导致了这个问题
在这里插入图片描述
这段代码在 spring 5.2.9中是这样的
在这里插入图片描述
注释上写明了原因
在这里插入图片描述

所以最后如果有此类问题可以考虑两种方式

1.修改版本为5.2.7之前(更高版本的还没有验证是否修改了该问题)
2.考虑使用环绕通知

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值