認識Spring 的注解 (三)之 @AliasFor 使用規則


一、該標簽存在的意義

        顧名思義 @AliasFor 表示別名,它可以注解到自定義注解的兩個屬性上,表示這兩個互為別名,也就是說這兩個屬性其實同一個含義。該標簽存在的含義,從網上查發現有個點,

  •   若  自定義注解有一個屬性,且該屬性命名上為了體現其含義,所以有些復雜,這樣調用方必須每次使用自定義注解的時候,都必須寫明 屬性 ,然后設置,這樣會比較負責;
  •   同時若自定義注解繼承了另一個注解,要想讓調用方能夠設置繼承過來的屬性值,就必須在自定義注解中重新定義一個屬性,同時聲明該屬性是父注解某個屬性的別名。

二、該標簽的用法

/**
 * @AliasFor 用法:<br>
 * <li>用到注解 屬性上,表示兩個屬性互相為別名,互相為別名的屬性值必須相同,若設置成不同,則會報錯</li>
 * <li>注解是可以繼承的,但是注解是不能繼承父注解的屬性的,也就是說,我在類掃描的時候,拿到的注解的屬性值,依然是父注解的屬性值,而不是你定義的注解的屬性值<br>
 * 所以此時可以在子注解對應的屬性上加上@AliasFor<br>
 * <pre><code>
 *  
 * </code></pre>
 * </li>
 * @author sandy
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Inherited
public @interface MyAnnotation {
    @AliasFor(attribute = "location")
    String value() default "";
    
    @AliasFor(attribute = "value")
    String location() default "";
}

 

1、同個注解中的兩個屬性互為別名

  在 MyAnnitation 自定義注解類中,value屬性和location屬性互為別名,此時用的時候可以指定屬性名設置屬性值,也可以缺省屬性名:

(1) 指定屬性名設置屬性值

@MyAnnotation(location = "location")
public class AliasTest extends BaseTest {

    @Test
    public void test() {
        MyAnnotation myAnnotation = AnnotationUtils.getAnnotation(this.getClass(), MyAnnotation.class);
        System.out.println("value:" + myAnnotation.value() + ";loation:" + myAnnotation.location());
    }
}

輸出值為:
value:location;loation:location

 

@MyAnnotation(value = "location")
public class AliasTest extends BaseTest {
    @Test
    public void test() {
        MyAnnotation myAnnotation = AnnotationUtils.getAnnotation(this.getClass(), MyAnnotation.class);
        System.out.println("value:" + myAnnotation.value() + ";loation:" + myAnnotation.location());
    }
}
輸出值為:
value:location;loation:location

 

由上可知,無論指明設置哪個屬性名設置屬性值,另一個屬性名也是同樣屬性值。若兩個都指明屬性值,要求值必須相同,否則會報錯。

(2) 缺省屬性名設置屬性值

@MyAnnotation("location")
public class AliasTest extends BaseTest {
    @Test
    public void test() {
        MyAnnotation myAnnotation = AnnotationUtils.getAnnotation(this.getClass(), MyAnnotation.class);
        System.out.println("value:" + myAnnotation.value() + ";loation:" + myAnnotation.location());
    }
}

輸出值:
value:location;loation:location

 

2、繼承父注解的屬性,使其擁有更強大的功能

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Inherited
@MyAnnotation
public @interface SubMyAnnotation {
    
    @AliasFor(value="location",annotation=MyAnnotation.class)
    String subLocation() default "";
    @AliasFor(annotation=MyAnnotation.class)   //缺省指明繼承的父注解的中的屬性名稱,則默認繼承父注解中同名的屬性名
    String value() default "";
}

 

  在 SubMyAnnotation 中 明顯 subLocation 和 value 是互為別名。

(1) 將 SubMyAnnotation 中 value 默認值設置為 ddd,此時,使用注解時作如下配置會報錯

 

@SubMyAnnotation(subLocation = "location")
public class SubAliasTest extends BaseTest { @Test public void test() { SubMyAnnotation myAnnotation = AnnotationUtils.getAnnotation(this.getClass(), SubMyAnnotation.class); System.out.println("value:" + myAnnotation.value() + ";loation:" + myAnnotation.subLocation()); } }

 

(2) 不設置  SubMyAnnotation 中 value 默認值設置為 ddd,則如上的例子可以成功執行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM