先描述一下这个问题的应用场景,有如下一个业务方法,我们需要AOP来切这个业务方法,
public interface FooService { public void saveFoo(String name, int age); }在切入FooService业务方法的Aop Aspect中,我们要调用JBPM中一些方法推动流程,因此会有持久化的操作,
public class WorkFlowService { public Object completeTask(ProceedingJoinPoint call, String name, int age) throws Throwable { //...... //Invoke JBPM method //...... return call.proceed(); } }对于FooService,我们配置Spring事务管理来管理关于持久化的操作,问题来了,在执行FooService的saveFoo方法时,从控制台的日志看出Spring开启一个事务,saveFoo方法结束时,关闭了此事务,在调用completeTask进行JBPM操作时,Spring又开启了另外一个事务,我们希望的是saveFoo和completeTask在同一个事务中,因为Spring事务管理也是AOP的应用,如果方法调用流程如下 引用
Transaction AOP Begin Transaction
WorkFlowService AOP Invoke completeTask before FooService Invoke saveFoo WorkFlowService AOP Invoke completeTask after Transaction AOP Commit Transaction 那就需要Spring的事务AOP在最外层,就可以保证一个事务,所以就需要指定Spring AOP嵌套顺序,order数值越小就在更外层
<aop:aspect order="10"> ...... </aop:aspect> |
|