在Spring中,如何标记交易信息?

时间:2018-03-07 08:17:35

标签: java spring aop

我需要以某种方式标记交易。需要一些方法,如: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;
}
}

正如您所看到的,我需要以某种方式标记事务,因此方面不会在一个事务中多次触发。但是对于每种服务方法仍然需要方面。只是不要激发服务方法的内在呼唤。

1 个答案:

答案 0 :(得分:0)

使用cflow()cflowbelow()切入点,无需手动记账即可实现您的目标。不幸的是,它们是unavailable in Spring AOP,但如果您将Spring配置为使用AspectJ with LTW (load-time weaving),则可以使用它们。

但是,如果你想坚持使用Spring AOP,你确实需要进行手动记账,例如使用ThreadLocal成员(假设每个事务在一个单独的线程中执行)或其他任何合适的事件。但也许Spring框架中有一些板载方法可以实现您需要的行为。我不是Spring用户,所以我无法帮助你。我只知道AOP。

随意提出后续问题和/或提供更多代码,然后我可以更具体。