是否可以编写 AOP 注释?
Is it possible to compose AOP annotations?
所以,我有 2 个注释 A 和 B 来自现有 java 库并实现了 AOP。
他们都做了我的 class 所必需的事情,我需要将它们按以下顺序排列(A 在 B 之前):
public class MyClass{
@A(parameter="par")
@B(value="key")
public void method(){
}
}
是否可以将第三个注释 C 定义为两者的组合?
所以最后我会得到:
public class MyClass{
@C(parameter="par", value="key")
public void method(){
}
}
编辑: 添加了从@A 获取参数的要求以及我没有源代码的事实,因为注释是从库中获取的。
这取决于您使用的库。例如 spring 做
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
/**
* Exclude specific auto-configuration classes such that they will never be applied.
* @return the classes to exclude
*/
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};
使用这种方法,您将拥有:
@A
@B
public @interface C{
@AliasFor(annotation = B.class)
String value();
@AliasFor(annotation = А.class, attribute = "parameter")
String param();
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@A
@B
public @interface C {
@AliasFor(annotation = B.class, attribute = "value")
String value() default {};
}
让我知道这是否有效。
所以,我有 2 个注释 A 和 B 来自现有 java 库并实现了 AOP。
他们都做了我的 class 所必需的事情,我需要将它们按以下顺序排列(A 在 B 之前):
public class MyClass{
@A(parameter="par")
@B(value="key")
public void method(){
}
}
是否可以将第三个注释 C 定义为两者的组合? 所以最后我会得到:
public class MyClass{
@C(parameter="par", value="key")
public void method(){
}
}
编辑: 添加了从@A 获取参数的要求以及我没有源代码的事实,因为注释是从库中获取的。
这取决于您使用的库。例如 spring 做
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
/**
* Exclude specific auto-configuration classes such that they will never be applied.
* @return the classes to exclude
*/
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};
使用这种方法,您将拥有:
@A
@B
public @interface C{
@AliasFor(annotation = B.class)
String value();
@AliasFor(annotation = А.class, attribute = "parameter")
String param();
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@A
@B
public @interface C {
@AliasFor(annotation = B.class, attribute = "value")
String value() default {};
}
让我知道这是否有效。