我使用spring aop和groovy并且有一个监视方面应该记录每个方法的执行时间。问题是groovy调用与java调用不同,因此以下代码始终打印" getMetaClass()"作为方法名称。
@Before("execution(* mypackage.MyService.*(..))")
void beforeMethod(JoinPoint joinPoint) {
logger.info(joinPoint.signature.name + " called")
}
我看到两种解决问题的方法:
有什么想法吗?
答案 0 :(得分:2)
对于选项1:
尝试将!getMetaClass()
Pointcut
添加到@Aspect
类,如下所示:
@Pointcut("!execution(* mypackage.MyService.*.getMetaClass(..))")
public void noMetaClassMethods() {}
将原始执行匹配器变为Pointcut
:
@Pointcut("execution(* mypackage.MyService.*(..))")
public void myServices() {}
然后将这两者合并到@Before
中,如下所示:
@Before("myServices() && noMetaClassMethods()")
void beforeMethod(JoinPoint joinPoint) {
logger.info(joinPoint.signature.name + " called")
}
它应该给你你想要的东西。
对于选项2:您可以在目标方法上为注释添加名称属性:
@Timed(name="methodIWantToTime")
def methodIWantTime(..)
然后只需将注释作为参数包含在Aspect
类中的方法:
@Around(value="@annotation(timed)")
def timeMethod(ProceedingJoinPoint proceedingJointPoint, Timed timed) {
println timed.name()
proceedingJointPoint.proceed()
}
并剥离它。