Spring中存在很多註解組合的情況,例如@RestController
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
* @since 4.0.1
*/
@AliasFor(annotation = Controller.class)
String value() default "";
}
@RestController就是@Controller、@ResponseBody兩個註解的組合,同時產生兩個註解的作用。
本人一開始以為這是Java的特性,Java能夠通過註解上的註解實現自動組合註解的效果。於是寫了這樣一段程式碼
/**
* @author Fcb
* @date 2020/6/23
* @description
*/
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyComponent {
}
/**
* @author Fcb
* @date 2020/6/23
* @description
*/
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@MyComponent
public @interface MyController {
}
@MyController
public class AnnotatedService {
}
結果測試發現翻車
/**
* @author Fcb
* @date 2020/6/23
* @description
*/
public class Test {
public static void main(String[] args) {
Annotation[] annotations = AnnotatedService.class.getAnnotations();
for (Annotation anno : annotations) {
System.out.println(anno.annotationType());
System.out.println(anno.annotationType() == MyComponent.class);
}
}
}
列印結果如下:
interface com.example.demo.anno.MyController
false
經過本人查閱資料,發現我想要的那個註解組合註解的功能是Spring自己實現的。。通過Spring中的AnnotationUtils.findAnnotation(類,註解)方法來判斷某個類上是否能找到組合的註解。
比如現在我想知道AnnotatedService這個類上是否存在@MyComponent註解,畢竟這是我一開始的目的(通過組合減少註解),我可以呼叫一下程式碼
/**
* @author Fcb
* @date 2020/6/23
* @description
*/
public class Test {
public static void main(String[] args) {
Annotation[] annotations = AnnotatedService.class.getAnnotations();
System.out.println(AnnotationUtils.findAnnotation(AnnotatedService.class, MyComponent.class));
}
}
列印如下:
@com.example.demo.anno.MyComponent()
假如傳入的註解是一個不存在的值,則會返回null,示例如下:
/**
* @author Fcb
* @date 2020/6/23
* @description
*/
public class Test {
public static void main(String[] args) {
Annotation[] annotations = AnnotatedService.class.getAnnotations();
System.out.println(AnnotationUtils.findAnnotation(AnnotatedService.class, OtherAnno.class));
}
}
控制檯列印:
null
總結:Java本身沒有實現 通過標記註解 來組合註解的功能。假如我們自定義註解時需要可以使用Spring的AnnotationUtils.findAnnotation()的方法幫助我們實現。
希望這篇文章對你有幫助~~~有空的話記得順手點贊呀~