spring boot事务@Transactional与自定义环绕aop执行顺序

有些场景需要自定义的环绕aop在spring事务提交后执行,比如事务提交后重新获取最新数据的场景。

方法一,通过定义@Order注解:
在自定义切面添加@Order(-1),其中-1随意定义,比Integer.MAX_VALUE小就行,因为@Transactional默认的order是Integer.MAX_VALUE。这样就能保证自定义的切面先执行,后完成。

备注:可以将spring aop想象成一个同心圆,要执行的方法为圆心,最外层的order最小。从最外层按照AOP1、AOP2的顺序依次执行doAround方法,doBefore方法。然后执行method方法,最后按照AOP2、AOP1的顺序依次执行doAfter、doAfterReturn方法。也就是说对多个AOP来说,先before的,一定后after。

方法二,通过代码保证自定义aop在事务提交之后执行:
示例代码如下:

if (TransactionSynchronizationManager.isActualTransactionActive()) {
    // 存在事物
    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
        // 事务已完成
        @Override
        public void afterCommit() {
        // TODO 自定义代码,比如解锁
        }
    });
 } else {
   // 事务已完成
   // TODO 自定义代码,比如解锁
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容