认识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,则如上的例子可以成功执行
分类:
Spring boot
标签:
@AliasFor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~