我有一个方法rangeQuery()
的接口,我试图使用Spring AOP在所有子类型中进行分析。特别是,对于rangeQuery()
的任何调用,我想知道它在其身体的某个字段上调用另一个方法distance()
的次数。
我知道我可以写一个方法来计算所有对距离的调用,如下所示:
@Before("execution(* *.distance(..))")
public void count(JoinPoint joinPoint) {
count++
}
但是,这不会捕获哪个rangeQuery()
调用它。
有什么想法吗?
答案 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个位置以查看它是否是您正在寻找的方法。例如,您知道的一系列方法应该在某个给定的顺序中在堆栈上,但允许任何其他中间堆栈元素发生。否则,代码中的任何更改都会使建议停止工作。