我需要以某种方式标记交易。需要一些方法,如:TransactionAspectSupport.setData(someObject);然后,直到交易活着,我希望能够读取这些数据。
我需要在Aspect类中检查当前事务的某些操作是否已经进行。
编辑: 说明我的意思。我们有两个班级。
服务类:
class Service {
@Transactional
public void serviceA(){
// do something
serviceB();
}
@Transactional
public void serviceB(){
// do something
}
}
Aspect类:
@Aspect
class ServiceAspect {
@Pointcut("execution(public * service*)")
private void checkTransaction(){};
@Around("checkTransaction()")
public Object _checkTransaction(ProceedingJoinPoint joinPoint) throws Throwable {
if (!isTransactionFlagged())
doTheCheckingJob()
transactionInfo.setData(Boolean.True);
}
private boolean isTransactionFlagged() {
if (transactionInfo.getData != null)
return true;
return false;
}
}
正如您所看到的,我需要以某种方式标记事务,因此方面不会在一个事务中多次触发。但是对于每种服务方法仍然需要方面。只是不要激发服务方法的内在呼唤。
答案 0 :(得分:0)
使用cflow()
或cflowbelow()
切入点,无需手动记账即可实现您的目标。不幸的是,它们是unavailable in Spring AOP,但如果您将Spring配置为使用AspectJ with LTW (load-time weaving),则可以使用它们。
但是,如果你想坚持使用Spring AOP,你确实需要进行手动记账,例如使用ThreadLocal
成员(假设每个事务在一个单独的线程中执行)或其他任何合适的事件。但也许Spring框架中有一些板载方法可以实现您需要的行为。我不是Spring用户,所以我无法帮助你。我只知道AOP。
随意提出后续问题和/或提供更多代码,然后我可以更具体。