组合注解

被注解的注解称为组合注解。

1.好处

  • 简单化注解配置,用很少的注解来标注特定含义的多个元注解
  • 提供了很好的扩展性,可以根据实际需要灵活的自定义注解。

2 如何使用

(1)自定义一个组合注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration //实际上就是一个bean注解
@ComponentScan//自动扫描对应value(package路径)值下面的所有bean
public @interface  WiselyConfiguration {
    String[] value() default{};//可以不写,实际在@ComponentScan注解中已经定义过,所以可以拿过来直接用
}

(2)使用自定义注解

//@Configuration //属性注解
//@ComponentScan("com.gdb.spingboot.service")  // 要扫描的bean路径
@WiselyConfiguration(value = "com.gdb.spingboot.service")  //自定义注解,扫描的所有的bean来源于value值所对应的包路径下
public class ElConfig{
}

组合注解,和上面两个注解实现的功能完全一致,所以如果在繁琐的注解被多次使用的情况下,可以考虑自定义组合注解。

注解继承

@Inhberited注解可以让指定的注解在某个类上使用后,这个类的子类也将自动被该注解标记。

@Retention(RetentionPolicy.RUNTIME)
@Inherited 
public @interface Hello {
}

public class AnnotationTest3{
    //在基类上使用被@Inherited标记了的注解@Hello@HelloclassBase{}
    //派生类没有直接注解@HelloclassDerivedextendsBase{}
    public static void main(String[] args){
    //派生类也会自动被注解@Hello标记。if( Derived.class.isAnnotationPresent(Hello.class)){
        Hello hello = (Hello)Derived.class.getAnnotation(Hello.class);
        System.out.println("Hello");
        }
    }
}

注解的其它事项

(1)当注解中含有数组属性时,使用{}赋值,各个元素使用逗号分隔。

(2)注解的属性可以是另外一个注解。

(3)注解的属性可以是另外一个注解的数组。

(4)注解的默认属性是value,只有一个value属性时可以不写value=xxx,直接写值即可。

(5)注解的属性的默认值使用default来定义。

//定义注解
@Retention(RetentionPolicy.RUNTIME)
public @interface SomeFuture {
    String value();//默认的属性int[]  arrayValue(); //数组Hello  helloValue();//是另外一个注解@Hello
    Hello[] helloArrayValue() default {@Hello,@Hello}; //注解的数组,而且提供默认值。
}
//使用注解
@SomeFuture(
    value="hello", //默认属性
    arrayValue={1,2,3},//数组属性
    helloValue=@Hello,//属性是另外一个注解
    helloArrayValue={@Hello,@Hello,@Hello}//属性是另外一个注解的数组。
)
public class AnnotationTest4{
}