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.考虑使用环绕通知