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.
我定义了一个自定义注释如下。
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.