我正在使用 Guice 和 AspectJ,我正在尝试做一些 AOP 来测量某些方法的执行时间。
我有这个注释,它将用于注释我需要测量的所有方法:
@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() 方法的执行没有注释。
有什么办法可以解决这个问题吗?