Spring AOP计数从另一个方法调用特定方法的次数

时间:2011-01-30 15:41:54

标签: java spring-aop

我有一个方法rangeQuery()的接口,我试图使用Spring AOP在所有子类型中进行分析。特别是,对于rangeQuery()的任何调用,我想知道它在其身体的某个字段上调用另一个方法distance()的次数。

我知道我可以写一个方法来计算所有对距离的调用,如下所示:

@Before("execution(* *.distance(..))") 
public void count(JoinPoint joinPoint) {
    count++
}

但是,这不会捕获哪个rangeQuery()调用它。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可能必须使用允许您使用@Before来获取源位置的@Around,而不是使用ProceedingJoinPoint

 @Around(" ..... ")
  public void test(ProceedingJoinPoint pjp) throws Throwable {

    SourceLocation sl = pjp.getSourceLocation();
    System.out.println(sl.getFileName());
    System.out.println(sl.getLine());
    System.out.println(sl.getWithinType());

    // allow through
    pjp.proceed();
  }

在您的情况下,听起来您可能需要call而不是execution,但在Spring AOP中似乎不支持call: -

  

其他切入点类型

     

完整的AspectJ切入点语言   支持额外的切入点   不受支持的指示符   弹簧。这些是:电话,   初始化,预初始化,   staticinitialization,get,set,   处理程序,建议执行,内码,   cflow,cflowbelow,if,@ this,和   @withincode。使用这些切入点   切入点表达式中的指示符   由Spring AOP解释将导致   在IllegalArgumentException中   抛出。

答案 1 :(得分:0)

作为最后的手段,在上面的@Before建议中,您可以使用Thread.currentThread.getStackTrace()并查看来电者是否为rangeQuery

但是,您应该在堆栈跟踪中找到一些固定的“模式”,而不仅仅是检查第N个位置以查看它是否是您正在寻找的方法。例如,您知道的一系列方法应该在某个给定的顺序中在堆栈上,但允许任何其他中间堆栈元素发生。否则,代码中的任何更改都会使建议停止工作。