iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0
自我挑戰組

探索 Spring Boot Doc系列 第 6

@SpringBootApplication - 別名標籤 @AliasFor

  • 分享至 

  • xImage
  •  

在接續前一日的內容介紹 @SpringBootApplication 往標籤的屬性看下去之前,我們得看一個會用到的 @AliasFor 標籤,等解釋完 @AliasFor 標籤用途之後,我們在拉回來看 @SpringBootApplication 標籤的屬性意義。

@AliasFor 這個標籤屬於 org.springframework.core.annotation 包下面,根據官方文件 @AliasFor 使用場景(Usage Scenarios) 有以下三種

  1. Explicit aliases within an annotation
  2. Explicit alias for attribute in meta-annotation
  3. Implicit aliases within an annotation

下方為 AliasFor 標籤可選元素( 筆者習慣說標籤屬性)
https://ithelp.ithome.com.tw/upload/images/20230921/201617709k5JF07Yry.png

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


上一篇
Doc 6.3.2 Importing XML Configuration & Doc 6.4 Auto-configuration
下一篇
Inside in Annotation SpringBootApplication
系列文
探索 Spring Boot Doc30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言