2011-08-27 96 views
6

我对AspectJ很新,有一个问题,即使有些研究我无法解决。关于银行我有以下方面,该方面检查银行的​​余额是否在每次公开方法调用后都持有。使用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(),它本身是一个公共银行方法。因此,每次都会建议此方面,并且此递归问题会持续进行,直到出现异常情况为止。有没有办法解决这个问题,例如关闭方面内的建议机制?

回答

4

试试这个:

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

谢谢,这正是我正在寻找的。 –

0

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

此外,您的切入点定义似乎过于宽泛无论如何:我认为您的方面实施的平衡检查应执行只写方法方法。所以像getTotalBalance这样的只读电话不应该被匹配。你有没有办法区分目标类中的只读和写入方法, G。通过现有的交易注释或类似的东西?

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

+0

这确实是可能使一些自定义的注释和解决问题的方式。尽管@Constantiner的解决方案要容易得多。无论如何感谢 –