假设他们是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的方法中建议所有连接点,但是您可能只对执行连接点感兴趣。

07-28 03:33