Spring 用于日志记录的 AspectJ 自定义注释

Spring AspectJ Custom Annotation for Logging

我定义了一个自定义注释如下。

package com.xyz;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Loggable {
    String message() default "Log Message";
}

我的方面 class 包含以下方法:

@Around(value = "@annotation(com.xyz.Loggable)")
public void logAround(ProceedingJoinPoint joinPoint) throws Throwable {
    // come code here
}

我的服务界面如下

public interface Service {
   @Loggable
   public void method1();
}

我的实现如下。

public class ServiceImpl implements Service {
     public void method1() {
         // some code here
     }
}

使用此设置,我的建议不会被触发。 (但是,如果我将 @Loggable 注释移动到 ServiceImpl class 中的 method1(),它就会被触发)。

我想保留在接口级别而不是方法实现级别定义的注释。有没有办法完成这项工作?

不,那不可能(还?)。

注解只能在 类 之间继承,即便如此,也只有当它们自己用元注解 @Inherited:

进行注解时

http://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Inherited.html

无法将接口上的注释继承到它们的实现中 类。

这在 AspectJ 文档中也有解释:http://www.eclipse.org/aspectj/doc/released/adk15notebook/annotations.html#annotation-inheritance

@Inherited annotations are not inherited when used to annotate anything other than a type. A type that implements one or more interfaces never inherits any annotations from the interfaces it implements.