【问题标题】:Recursion using AspectJ使用 AspectJ 进行递归
【发布时间】:2011-08-27 10:38:44
【问题描述】:

我对 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() 方法,它本身就是一个公共的 Bank 方法。因此,每次都会建议该方面,并且此递归问题会继续进行,直到抛出异常为止。有没有办法解决这个问题,例如关闭方面内的建议机制?

【问题讨论】:

    标签: java aspectj


    【解决方案1】:

    试试这个:

    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;
        }    
    }
    

    【讨论】:

    • 谢谢,这正是我想要的。
    【解决方案2】:

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

    此外,无论如何,您的切入点定义似乎过于广泛:我假设您在方面实现的余额检查应该仅针对 writing 方法执行。所以像getTotalBalance 这样的只读调用无论如何都不应该匹配。您是否有办法区分目标类中的只读和写入方法,例如。 G。通过现有的事务注释或类似的东西?

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

    【讨论】:

    • 确实可以进行一些自定义注释并以这种方式解决问题。尽管@Constantiner 的解决方案要容易得多。还是谢谢
    猜你喜欢
    • 2011-06-04
    • 2018-11-02
    • 2015-02-02
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多