Я использую Guice и AspectJ, и я пытаюсь выполнить АОП для измерения времени выполнения определенных методов.
У меня есть эта аннотация, которая будет использоваться для аннотирования всех методов, которые мне нужно измерить:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface MyStopWatch {
}
У меня есть перехватчик этого метода:
public class MyInterceptor implements org.aopalliance.intercept.MethodInterceptor {
private final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
final org.apache.commons.lang3.time.StopWatch stopWatch = org.apache.commons.lang3.time.StopWatch.createStarted();
final Object returnedObject = invocation.proceed();
stopWatch.stop();
logger.info("[STOPWATCH] Method: {} - Time: {}.", invocation.getMethod().getName(), stopWatch.getTime());
return returnedObject;
}
}
У меня есть этот интерфейс
public interface MySuperClass {
@MyStopWatch
default void test() {
System.out.println("Hello, world");
}
}
Затем у меня есть этот подкласс, который наследуется от MySuperClass:
public class MySubClass implements MySuperClass {
}
И, наконец, у меня есть эта привязка:
public class MyAOPModule extends AbstractModule {
@Override
protected void configure() {
bindInterceptor(
Matchers.any(),
Matchers.annotatedWith(MyStopWatch.class),
new MyInterceptor()
);
}
}
Я инициализирую свой Модуль Guice выглядит следующим образом:
public static void main(String[] args) throws Throwable {
Injector injector = createInjector(new MyAOPModule());
injector.getInstance(MySubClass.class).test();
}
Моя проблема в том, что ничего не регистрируется, как если бы выполнение метода test () подклассом не было аннотировано.
Я могу go обойти это?