2011-01-30 35 views
1

我有一個使用Spring AOP在所有子類型中進行配置的方法rangeQuery()的接口。特別是,對於任何打電話給rangeQuery()我想知道它有多少次調用另一個方法distance()在其領域的一個領域。Spring AOP計算從另一個特定方法調用的次數

我知道我可以寫計算所有通話距離如下的方法:

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

然而,這無法捕獲與rangeQuery()電話稱它。

任何想法?

+0

我對AOP並不熟悉,但看看http://www.eclipse.org/aspectj/doc/released/runtime-api/org/aspectj/lang/JoinPoint.html,也許getTarget( )或getThis()可能是解決方案的關鍵? – esaj 2011-01-30 15:44:44

回答

0

作爲最後的手段,在上述@Before建議,可以利用Thread.currentThread.getStackTrace(),看看來電者是rangeQuery

但是,您應該在堆棧跟蹤中找到一些固定的「模式」來查找,而不是隻檢查第N個位置以查看它是否是您要查找的方法。例如,你知道的一系列方法應該在某個給定的順序在堆棧中,但允許任何其他中間堆棧元素髮生。否則,您的代碼中的任何更改都會導致通知停止工作。

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但似乎call沒有在Spring AOP支持: -

其他的切入點類型

完整的AspectJ切入點語言 支持在 Spring中不支持的附加切入點 指示符。這些是: 初始化,預初始化, staticinitialization,get,set, handler,adviceexecution,withincode, cflow,cflowbelow,if,@this和 @withincode。在由Spring AOP解釋的切入點表達式 中使用這些切入點 的指示符將導致 在IllegalArgumentException中被拋出,其中 被拋出。

+1

getFileName()和getLine()都拋出unsupportedOperationException不幸 – Robert 2011-01-30 16:35:25

相關問題