2014-07-09 34 views
0

uppose疗法是A类:SpringAOP复杂的切入点

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(也许它有一些这方面的限制) 任何帮助?

+0

您的类是否实现了包含建议方法的接口? (默认情况下,Spring AOP使用JDK代理) –

回答

1

如果我使用普通的AspectJ我这样做:

execution(* B.getB()) && cflow(@withincode(SomeAnnotation))

“getB()与SomeAnnotation注释的方法的控制流程的执行但这并不意味着它会被逮住,如果。例如,如果使用SomeAnnotation注释的方法调用某些调用getB()的某个东西 - 会被这个建议捕获 - 这会被这个建议所捕获。

我不知道它如何在Spring AOP下运行。

编辑:在进一步思考时,上面的切入点可能不是最优的,因为@withincode()可能会创建比绝对必要的更多的字节码。更优化的版本可能是:

execution(* B.getB()) && cflow(execution(@SomeAnnotation * *(..)))

@withincode(SomeAnnotation)将通知所有参加的方法中的点标记@SomeAnnotation,但你可能只是在执行连接点感兴趣。