带有groovy的Spring AOP:得到被调用的方法

时间:2015-02-12 09:52:42

标签: spring groovy aop spring-aop

我使用spring aop和groovy并且有一个监视方面应该记录每个方法的执行时间。问题是groovy调用与java调用不同,因此以下代码始终打印" getMetaClass()"作为方法名称。

@Before("execution(* mypackage.MyService.*(..))")
void beforeMethod(JoinPoint joinPoint) {
    logger.info(joinPoint.signature.name + " called")
}

我看到两种解决问题的方法:

  1. 从常规调用中找到实际方法
  2. 使用其他方式获取被调用的方法(而不是注入jointPoint参数)
  3. 有什么想法吗?

1 个答案:

答案 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()
}

并剥离它。