Можно ли составить аннотации АОП? - PullRequest
0 голосов
/ 10 марта 2020

Итак, у меня есть 2 аннотации A и B из существующих библиотек java, которые реализуют AOP.

Обе они делают что-то, что необходимо моему классу, и мне нужно расположить их в таком порядке (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(){

    }
}

edit: добавил требование взять параметр из @A и тот факт, что у меня нет исходного кода как аннотации взяты из библиотек.

Ответы [ 2 ]

1 голос
/ 10 марта 2020
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@A
@B
public @interface C {
    @AliasFor(annotation = B.class, attribute = "value")
    String value() default {};
}

Дайте мне знать, если это работает.

1 голос
/ 10 марта 2020

Это зависит от используемой вами библиотеки. например весна делает

 @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();
    }
...