假设他们是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");
}
}
我们如何创建指向B.getB()执行的切入点,该切入点是在用@SomeAnnotation注释的方法中调用的?
这是我尝试过的
@Aspect
public class LocalizationAspect {
@Before(value = "@within(Localize) && execution(* B.getB())")
public void aspectStuff() {
System.out.println("aspect");
}
}
只是为了阐明我的观点:预期的输出将在调用justDoIt2();时出现。
方面
得到
但是当调用justDoIt1();时
得到
注意:我正在使用SpringAOP(也许对此有一些限制)
有什么帮助吗?
最佳答案
如果我使用普通的AspectJ,则可以这样做:execution(* B.getB()) && cflow(@withincode(SomeAnnotation))
“在具有SomeAnnotation注释的方法的控制流中执行getB()。但这确实意味着,如果在流程的更深层(可能不是您想要的),它将被捕获。例如,如果使用SomeAnnotation注释的方法调用了然后调用getB()的其他内容-将被此建议捕获。
我不知道它在Spring AOP下的表现如何。
编辑:进一步思考,上面的切入点可能不是最佳选择,因为@withincode()可能会创建比绝对必要更多的字节码。更好的版本可能是:execution(* B.getB()) && cflow(execution(@SomeAnnotation * *(..)))
@withincode(SomeAnnotation)将在标记为@SomeAnnotation的方法中建议所有连接点,但是您可能只对执行连接点感兴趣。