在实际编写切面方法和应用切面的时候,发现在对象内的方法之间调用,是不会进入定义在方法上的切面的。
场景
存在一个bean对象,对bean对象的两个方法methodA和methodB都应用了切面。在methodA方法里会调用methodB方法。
现在从外部调用bean.methodA(),其实你希望得到的效果是:
proxy bean
methodAP() ---> methodA
|
/---------------/
|
V
methodBP() ---> methodB
而实际得到的效果是
proxy bean
methodAP() ---> methodA
|
V
methodBP() ---> methodB
原因分析
在methodA内部调用methodB时,方法是直接进行调用,并不会调用到代理对象的代理方法上。
解决方案
重构代码
methodA不调用methodB
methodA和methodB放置在两个不同的类中
将methodB的切面方法代理逻辑合并到methodB的代理逻辑中
使用AspectJ进行编译织入
-
显式调用代理对象的方法
public void methodA(){ ((BeanClassName)AopContext.currentProxy()).methodB(); }
目前,推荐的也只有第一种方法。对代码进行重构,methodB可能就不应该允许从外面进行调用。而第二种会影响所有的切面,而且需要借助aspectJ来进行编译。第三种对代码有侵入性。