组合注解
被注解的注解称为组合注解。
1.好处
- 简单化注解配置,用很少的注解来标注特定含义的多个元注解
- 提供了很好的扩展性,可以根据实际需要灵活的自定义注解。
2 如何使用
(1)自定义一个组合注解
1 2 3 4 5 6 7 8
| @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration //实际上就是一个bean注解 @ComponentScan//自动扫描对应value(package路径)值下面的所有bean public @interface WiselyConfiguration { String[] value() default{};//可以不写,实际在@ComponentScan注解中已经定义过,所以可以拿过来直接用 }
|
(2)使用自定义注解
1 2 3 4 5
| //@Configuration //属性注解 //@ComponentScan("com.gdb.spingboot.service") // 要扫描的bean路径 @WiselyConfiguration(value = "com.gdb.spingboot.service") //自定义注解,扫描的所有的bean来源于value值所对应的包路径下 public class ElConfig{ }
|
组合注解,和上面两个注解实现的功能完全一致,所以如果在繁琐的注解被多次使用的情况下,可以考虑自定义组合注解。
注解继承
@Inhberited注解可以让指定的注解在某个类上使用后,这个类的子类也将自动被该注解标记。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @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来定义。
1 2 3 4 5 6
| //定义注解 @Retention(RetentionPolicy.RUNTIME) public @interface SomeFuture { String value();//默认的属性int[] arrayValue(); //数组Hello helloValue();//是另外一个注解@Hello Hello[] helloArrayValue() default {@Hello,@Hello}; //注解的数组,而且提供默认值。 }
|
1 2 3 4 5 6 7 8 9
| //使用注解 @SomeFuture( value="hello", //默认属性 arrayValue={1,2,3},//数组属性 helloValue=@Hello,//属性是另外一个注解 helloArrayValue={@Hello,@Hello,@Hello}//属性是另外一个注解的数组。 ) public class AnnotationTest4{ }
|