在接續前一日的內容介紹 @SpringBootApplication 往標籤的屬性看下去之前,我們得看一個會用到的 @AliasFor 標籤,等解釋完 @AliasFor 標籤用途之後,我們在拉回來看 @SpringBootApplication 標籤的屬性意義。
@AliasFor 這個標籤屬於 org.springframework.core.annotation 包下面,根據官方文件 @AliasFor 使用場景(Usage Scenarios) 有以下三種
下方為 AliasFor 標籤可選元素( 筆者習慣說標籤屬性)
Explicit aliases within an annotation (同屬性的別名)
只有使用單一個 @AliasFor 並無夾帶可選元素 Optional Element (annotation 、attribute、value ),這樣的用法會是成對使用,代表標記的選項互為可替代。
上方是官方 Api 的說明,但寫的不是甚懂。
來直接看一個我們之前就看過的標籤@ComponentScan,其原始碼如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
// ....
}
注意我所條列原始碼條列的屬性 value() 、 basePackage() ,前後的 String[] (填入值) 以及 default {} (預設值) 的部分,是完全相同的。
此時再搭配, @ComponentScan Api 文件對應部分來看
Modifier and Type | Optional Element | Description |
---|---|---|
String[] | basePackages | Base packages to scan for annotated components. |
String[] | value | Alias for basePackages(). |
value 就是當作一個 basePackages 的一個別名做使用,更簡單來說,假若今天有人寫出下方的 |
@ComponentScan(basePackages = "com.scheep.service")
其實等同於
@ComponentScan(value = "com.scheep.service")
Explicit alias for attribute in meta-annotation(跨註解的屬性別名)
透過 Annotation Service 標籤(@Service) 的原始碼 來暸解 @AliasFor 的使用方法
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
@AliasFor(annotation = Component.class)
String value() default "";
}
由上方原始碼,可以看到 Service 標籤上方掛者 @Component 標籤(i.e. meta-annotation),同時下方搭配者**@AliasFor annotation (explicit alias)** 。 結合上述兩者意義,再來看這個用法的英文解釋 Explicit alias for attribute in meta-annotation 就很簡單明瞭; 有一個用來描述 Annotation Service
的標籤 @Component (稱其為 meta-annotation,用來描述標籤的標籤,和 meta-data 之中的 meta 字首有相同的實際意義,這裡是透過 @Component 去描述 @Service),而 @Service 的 attribute 就是填寫 @Component value這個attribute 的值。
意思就是如下區塊所描述的等價意義:
@Service(value = “MyService”)
//等同於以下功能
@Component(value = "MyService")
換句話說,當我們在 @Service(value = “MyServie”) 的時候,就是在為 @Component 填寫屬性質,
也就是說當你有填寫 @Service 的 value 時候,你就有 @Component value 的功用。
Implicit aliases within an annotation
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@RequestMapping
public @interface MyMapping {
@AliasFor(annotation = RequestMapping.class, attribute = "method")
RequestMethod[] action() default {};
}
由上方的原始碼,關注 @RequestMapping 這一個 meta-annotation,@MyMapping 的屬性 action 就是和 @RequestMapping 的 method 同意義,也就是有如下方程式碼區塊所示的功能:
@MyMapping(action = RequestMethod.GET) //等同於下方
@RequestMapping(method = RequestMethod.GET)
參考資料
@ComponentScan 標籤 Api
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/ComponentScan.html
@AliasFor 標籤 Api
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/AliasFor.html
@AliasFor 使用說明一
https://www.baeldung.com/spring-aliasfor-annotation
@AliasFor 使用說明二
https://juejin.cn/post/6844904153966182407