@AliasFor

@AliasFor

@AliasFor 注解用于声明注解属性的别名,主要有两种应用场景:注解内的别名和元数据的别名。

注解内的别名

首先,让我们深入了解 @AliasFor 的源码以理解其在注解内别名的应用。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface AliasFor {

   @AliasFor("attribute")
   String value() default "";

   String attribute() default "";

   Class<? extends Annotation> annotation() default Annotation.class;
}

在这里,我们看到了 @AliasFor 注解自身使用了注解内别名的特性。具体而言,当我们使用这个注解时,@AliasFor(value="xxx")@AliasFor(attribute="xxx") 是等价的。

举例来说,假设有一个注解 @MyAnnotationA

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface MyAnnotationA {
   
   String a1() default "";
}

使用这个注解时,我们可以这样写: @MyAnnotationA(a1="xxx"),表示将属性 a1 设置为 “xxx”。

现在,如果我们想以另一种方式使用这个注解,例如 @MyAnnotationA(a2="xxx"),我们可以通过别名的方式实现。修改 @MyAnnotationA 如下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface MyAnnotationA {

   @AliasFor("a2")
   String a1() default "";

   @AliasFor("a1")
   String a2() default "";
}

在这个用法中需要注意几点:

  • 组成别名对的每个属性都必须加上注解 @AliasForattribute()value() 属性必须引用该对中另一个属性。
  • 别名属性必须声明相同的返回类型。
  • 别名属性必须声明一个默认值。
  • 别名属性必须声明相同的默认值。

元数据的别名

其次,我们来看元数据的别名的应用。直接以一个例子说明:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@MyAnnotationA
public @interface MyAnnotationB {

   @AliasFor(annotation = MyAnnotationA.class, value = "a2")
   String value() default "";
}

在这个例子中,@MyAnnotationB("vvv")@MyAnnotationA(a2="vvv") 是等价的。这里可以理解为,MyAnnotationBvalue 属性重写了 MyAnnotationAa2 属性,但重新的属性的返回类型必须相同。

在 Spring 框架中,这种用法很常见。例如,以 @Component@Configuration 为例:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {

   @AliasFor(annotation = Component.class)
   String value() default "";

   boolean proxyBeanMethods() default true;
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {

   String value() default "";
}

对于 value 这个属性来说,@Configuration 注解中的值会重写 @Componentvalue 属性值。这可以理解为 @Configuration 注解是 @Component 的子注解。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码有点萌

谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值