使用 AOP 覆盖 @override

Override @override with AOP

我是第一次尝试 AOP。我想在 @Override 符号上做 AOP 来写日志。它似乎几乎可以工作但是:

  1. 我必须在每个 class 中导入我自己的 Override class。这是正常的吗?我认为它会 神奇地 先通过我的 @Override 装饰器,然后再通过 Java 装饰器。
  2. 我有这种非常奇怪的行为,取决于我首先调用的端点,它会在之后继续工作,或者只对这个端点有效。比如说,我有 /a 和 /b,如果我先调用 /b,它会显示我的日志,然后我调用 /a 它不会显示任何内容,如果之后我调用 /b 它将显示日志。但是,如果我先调用 /a,它会工作,然后我调用 /b 并且它会工作,并且它会一直为所有这些工作。这对我来说毫无意义。

这是我的 OverrideInterceptor:

@Slf4j
public class OverrideInterceptor implements MethodInterceptor<Object, Object> {

  @Override
  public Object intercept(MethodInvocationContext<Object, Object> context) {
    String prettyMethod = context.getDeclaringType().getSimpleName() + "." + context.getName();
    log.debug("{} with params {}", prettyMethod, context.getParameterValueMap());
    long start = System.nanoTime();
    Object result = context.proceed();
    long end = System.nanoTime() - start;
    log.debug("Execution of " + prettyMethod + " took: " + (end/1000) + "ms.");
    return result;
  }
}

还有我的注释:

@Documented
@Retention(RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Around
@Type(OverrideInterceptor.class)
public @interface Override {

}

两个 class 都在包中:包 com.time.infrastructure.config;

我在 com.time.infrastructure.db、com.time.infrastructure.rest、com.time.application.repository 等下的包中使用此 @Override 注释

对于第 1 点:built-in @Override 注释是一个普通的 @interface - 它位于 java.lang 包中。您在这里所做的是在包 com.time.infrastructure.config 中创建了一个名为 Override 的自定义注解,它与 java.lang.Override 无关。所以从这个意义上说,它是“正常的”,但它可能并没有按照你的想法行事。不幸的是,您不能在 Java 中子类型注释。