Spring AOP复杂切入点

时间:2014-07-09 15:50:32

标签: java aop spring-aop

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(也许它对此有一些限制) 对此有何帮助?

1 个答案:

答案 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的方法中的所有连接点,但您可能只对执行连接点感兴趣。