uppose ther是A类:
public class A {
public B b;
public void justDoIt1(){
b.getB();
}
@SomeAnnotation
public void justDoIt2(){
b.getB();
}
}
和B级:
public class B{
public void getB(){
System.out.println("get");
}
}
我们如何创建切入点来执行从@SomeAnnotation注释的方法中调用的B.getB()?
以下是我尝试的内容
@Aspect
public class LocalizationAspect {
@Before(value = "@within(Localize) && execution(* B.getB())")
public void aspectStuff() {
System.out.println("aspect");
}
}
只是为了明确我的观点:预期输出将是在调用justDoIt2();
时方面 获得
但是在调用justDoIt1();
时获取
注意:我使用的是SpringAOP(也许它对此有一些限制) 对此有何帮助?
答案 0 :(得分:1)
如果我使用普通的AspectJ,我会这样做:
execution(* B.getB()) && cflow(@withincode(SomeAnnotation))
"在使用SomeAnnotation注释的方法的控制流中执行getB()。但这确实意味着如果流程更深入会被抓住,这可能不是你想要的。例如如果使用SomeAnnotation注释的方法调用调用其他东西然后调用getB()的东西 - 这将被此建议捕获。
我不知道它在Spring AOP下会如何表现。
编辑:进一步思考,上面的切入点可能不是最优的,因为@withincode()可能创建比绝对必要的更多的字节代码。更优化的版本可能是:
execution(* B.getB()) && cflow(execution(@SomeAnnotation * *(..)))
@withincode(SomeAnnotation)将建议标记为@SomeAnnotation的方法中的所有连接点,但您可能只对执行连接点感兴趣。