@AliasFor注解
@AliasFor是一個注解,用於為注解屬性聲明別名。
代碼如下:它有兩個屬性value和attribute @AliasFor注解注釋了
自身,並且value和attribute互為別名
把多個元注解的屬性組合在一起形成新的注解
如我們熟知的@SpringBootApplication :
如上所示@SpringBootApplication並沒有定義新的屬性而是復用其他注解已有的注解屬性並對其進行組合
形成新的注解從而到達到便捷的目的。這樣的注解我們可以稱之為復合注解。
所以在使用SpringBoot 時我們只需要@SpringBootApplication一個注解就能開啟
自動配置,自動掃描的功能。
而不再需要使下面三個注解來達到同樣的目的。
@Configuration
@ComponentSan
@EnnableAutoConfiguration
2.繼承注解的功能
如@Controller,@Service,@Repository都繼承了@Component的功能
他們的基本作用和@Component完全一樣都是標明某個類是
Spring的Bean,需要Spring容器進行管理。不同之處在於對Spring bean進行了歸類,從而能對不同類型的Bean進行不同的處理。
@Service代碼如下
在同個注解中為同一個功能定義兩個名稱不一樣的屬性,那么這兩個屬性彼此互為別名
如@RequestMapping注解中的value和path它們兩互為別名。如下所示:
這么做的目的在於
1.更便捷
當我們只定義一個屬性的時候往往可以省略屬性名如:
@RequestMapping(“/user”)
2.顧名思義
當我門定義多個屬性時為了能做到顧名思義
使之達到一目了然的效果我們需要選擇一個更加貼合特定場景的名稱。
@RequestMapping(path = “/user”,method = RequestMethod.GET)
當然你也可以這樣:
@RequestMapping(value = “/user”,method = RequestMethod.GET)
只是這樣子的定義value = “/user” 不能很准確地傳達代碼的意圖。
根據@AliasFor的使用形式我們可以將它分為三類:
1.注解內部的顯性別名
在單個注解中,可以把@AliasFor聲明在一對屬性上標明它們彼此之間互無別名如下所示: ContextConfiguration中的value和locations是彼此的顯性別名
實現要求:
1.組成別名對的每個屬性都必須用@AliasFor進行注釋,並且AliasFor中的值
必須指向別名對中的另一個屬性
2.別名化的屬性必須聲明相同的返回類型
3.別名化的屬性必須聲明默認值
4.別名化的屬性默認值必須相同
2.用於元注解屬性的顯性別名
如果被@AliasFor注釋的屬性指向的是它所在注解之外的其他注解,
那么這個屬性被解釋成元注解屬性的別名。(稱之為顯性的元注解屬性重寫)
我們可以通過重寫繼承一個或多個其他注解的功能從而
使得可以更細粒度精准地控制注解層級中屬性的重寫,
不像Java中繼承必須繼承父類的所有功能。
實際上,使用@AliasFor甚至可以為元注解的value屬性聲明別名.
如下所示:@MyTestConfig下的xmlFiles指向的是一個元注解@ContextConfiguration的屬性locations
實現要求:
1 如果一個屬性是一個元注解屬性的別名,那么這個屬性必須用@AliasFor進行注釋並且
該屬性必須指向元注解屬性。
2 別名化的屬性必須聲明相同的返回結果
3.@AliasFor的annotation屬性必須引用元注解
4.被引用的元注解必須放置在聲明了@AliasFor的注解類上
3 注解中的隱性別名
如果注解中的一個或多個屬性聲明為同一個元注解屬性的屬性重寫(直接地或傳遞地重寫)
那么這些注解會被當作彼此的隱性別名集來對待
結果是它們的行為類似於注解中的顯性別名
如下所示:@MyTestConfig中,value,groovyScripts和xmlFiles
都是復寫了@ContextConfiguration中locations屬性的,因此這
三個屬性是彼此的隱性別名。
注解中的可傳遞隱性別名
如下所示:在GroovyOrXmlTestConfig中,groovy是對上面的MyTestConfig中的groovyScripts屬性顯示的復寫,
而xml是對@ContextConfiguration中locations屬性的顯示的復寫,
我們就可以稱groovy和xml是彼此的可傳遞隱性別名,因為它們實際上只是復寫ContextConfiguration中的locations屬性。
實現要求:
1.屬於隱性別名組中的每一個屬性必須使用@AliasFor進行注釋,並且attribute必須引用相同元注解中的同一個屬性
2.別名化的屬性必須聲明相同的返回類型
3.別名化的屬性必須定義默認值
4.別名化的屬性必須聲明相同的默認值
5.注解必須引用合適的元注解
6.被引用的元注解必須放置在聲明了@AliasFor的注解上