使用 AOP 覆盖 @override
Override @override with AOP
我是第一次尝试 AOP。我想在 @Override 符号上做 AOP 来写日志。它似乎几乎可以工作但是:
- 我必须在每个 class 中导入我自己的 Override class。这是正常的吗?我认为它会 神奇地 先通过我的 @Override 装饰器,然后再通过 Java 装饰器。
- 我有这种非常奇怪的行为,取决于我首先调用的端点,它会在之后继续工作,或者只对这个端点有效。比如说,我有 /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 中子类型注释。
我是第一次尝试 AOP。我想在 @Override 符号上做 AOP 来写日志。它似乎几乎可以工作但是:
- 我必须在每个 class 中导入我自己的 Override class。这是正常的吗?我认为它会 神奇地 先通过我的 @Override 装饰器,然后再通过 Java 装饰器。
- 我有这种非常奇怪的行为,取决于我首先调用的端点,它会在之后继续工作,或者只对这个端点有效。比如说,我有 /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 中子类型注释。