Java 使用AspectJ的递归

Java 使用AspectJ的递归,java,aspectj,Java,Aspectj,我对AspectJ还很陌生,有一个问题,尽管有些研究我无法解决。我有以下关于银行的方面,该方面检查在每次公共方法调用之后银行的余额是否保持不变 pointcut BankCheck(Bank bank): call(public * Bank.*(..)) && target(bank); Object around(Bank bank): BankCheck(bank) { int balance = bank.getTotalBalance(); Objec

我对AspectJ还很陌生,有一个问题,尽管有些研究我无法解决。我有以下关于银行的方面,该方面检查在每次公共方法调用之后银行的余额是否保持不变

pointcut BankCheck(Bank bank): call(public * Bank.*(..)) && target(bank);

Object around(Bank bank): BankCheck(bank) {
    int balance = bank.getTotalBalance();
    Object result = proceed(bank);
    if (balance != bank.getTotalBalance()) {
        LOGGER.warn("The total balance of the bank is not equal.");
    } else {
        LOGGER.info("Ok");
    }
    return result;
}

问题是在方面中,我使用了方法bank.getTotalBalance(),它本身就是一个公共银行方法。因此,每次都会建议这个方面,并且这个递归问题会一直持续下去,直到出现异常为止。有没有办法解决这个问题,例如关闭方面内部的advice机制?

我对AspectJ切入点语法不太熟悉,但是您有没有办法从切入点定义中排除
getTotalBalance
调用?这将防止递归发生

此外,您的切入点定义似乎匹配得太广泛:我假设您在方面中实现的平衡检查应该只针对编写方法执行。因此,像
getTotalBalance
这样的只读调用无论如何都不应该匹配。你有没有办法区分目标类中的readonly和writing方法。G通过现有的事务注释或类似的东西

如果没有,您可能希望自己引入此类(自定义)注释,并调整切入点以匹配所有未标记为只读的公共方法调用。但这意味着修改目标类中的代码,这并不总是一个选项。但是YMMV。

试试这个:

public aspect BankTotalBalanceAspect {
    pointcut BankCheck(Bank bank): call(public * Bank.*(..)) && target(bank);

    Object around(Bank bank): BankCheck(bank) && !within(BankTotalBalanceAspect) {
        int balance = bank.getTotalBalance();
        Object result = proceed(bank);
        if (balance != bank.getTotalBalance()) {
            LOGGER.warn("The total balance of the bank is not equal.");
        } else {
            LOGGER.info("Ok");
        }
        return result;
    }    
}

谢谢,这正是我想要的。确实可以做一些自定义注释,并用这种方式解决问题。Inspite@Constantiner的解决方案要简单得多。无论如何谢谢你