Spring 组合注解&注解继承

组合注解

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

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{
}