Следуя инструкциям здесь: http://tapestry.apache.org/tapestry-ioc-decorators.html, я создал собственный декоратор аннотаций следующим образом:
и добавил его в модуль приложения
@Decorate
@TimeIt
public static <T> T decorateTimer(Class<T> serviceInterface, T delegate,
String serviceId, Logger logger,
TimerDecorator decorator) {
return decorator.build(serviceInterface, delegate, serviceId, logger);
}
Я следовал тому же коду для TimerDecorator
, что и в библиотеке Гобелена для LoggingDecoratorImpl
Тем не менее, когда я отмечаю службу (и / или метод внутри службы) с помощью @TimeIt
, она не вызывается
Нужно ли "добавить" этот декоратор в какое-то приложение по умолчанию? Может кто-нибудь привести пример того, как я это сделаю?
Я также попробовал ту же идею с «Советниками», и это тоже не вызывается
@Advise
@TimeIt
public static void adviseTimer(MethodAdviceReceiver receiver) {
MethodAdvice advice = invocation -> {
long start = System.currentTimeMillis();
invocation.proceed();
long end = System.currentTimeMillis();
System.out.println(invocation.getMethod().getName() + " took: " + (end - start) + " [ms]");
};
receiver.adviseAllMethods(advice);
}
EDIT
Когда я комментирую это следующим образом, вызывается мой декоратор
@Decorate
@Match("ASpecificManager")
public static <T> T decorateTimer(...)
Так что мне интересно, что-то не так с интерфейсом TimeIt
, который я написал?
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@UseWith(AnnotationUseContext.SERVICE)
public @interface TimeIt {
}
Вот как я это использую:
@TimeIt
public class ASpecificManagerImpl implements ASpecificManager {
...
}
РЕДАКТИРОВАТЬ # 2
похоже, что использовать его так работает
@Marker(TimeIt.class)
public class ASpecificManagerImpl implements ASpecificManager {
...
}
Тем не менее, это советует всем методам в классе ... Помещение его в конкретный метод класса по-прежнему советует ВСЕМ методам. Не могу ли я поместить эту аннотацию на конкретный метод класса (т.е. только на методы услуги я хочу на время)?