有些场景需要自定义的环绕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 自定义代码,比如解锁
}