按照此处的说明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
,我遵循与Tapestry的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);
}
编辑
当我如下注释时,我的装饰器被调用
@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 {
...
}
EDIT#2
似乎像这样使用它
@Marker(TimeIt.class)
public class ASpecificManagerImpl implements ASpecificManager {
...
}
但是,这建议类中的所有方法...将其放在类的特定方法上仍会建议所有方法。我不能将此注释放在类的特定方法上(即仅方法)我想计时的服务)?