2015-02-12 4 views
0

Я использую Spring aop с groovy и имею аспект мониторинга, который должен регистрировать время выполнения каждого метода. Проблема состоит в том, что вызов groovy не совпадает с вызовами java, поэтому следующий код всегда печатает «getMetaClass()» как имя метода.Spring AOP with groovy: get called method

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

Я вижу два пути решения проблемы:

  1. Найти фактический метод от заводной вызова
  2. использования какой-либо другой способ, чтобы получить вызываемый метод (вместо инъекционного jointPoint аргумент)

Любые идеи?

ответ

1

Для варианта 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() 
} 

и очистите его от этого.