使用AOP替代@override

问题描述

我第一次尝试AOP。我想对@Override表示法做AOP来写日志。它似乎几乎可以正常工作,但是:

  1. 我必须在每个类中导入自己的Override类。这正常吗?我认为它将神奇首先通过我的@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 {

}

两个类都在软件包中:com.time.infrastructure.config软件包;

我在com.time.infrastructure.db,com.time.infrastructure.rest,com.time.application.repository等包中的软件包中使用了@Override注释。

解决方法

对于点1:内置的@Override注释是普通的@interface-它位于java.lang包中。您在这里所做的是,您已经在包Override中创建了一个名称为com.time.infrastructure.config的自定义注释,它与java.lang.Override无关。因此从某种意义上讲,这是“正常”的,但可能并没有按照您的想法做。不幸的是,您不能在Java中对注释进行子类型化。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...