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,则如上的例子可以成功执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值