SpringBoot中注解@AliasFor的使用详解
目录
- 简介
- 用法1:注解的属性互为别名
- 简介
- 实例
- 用法2.继承父注解的属性,不重写属性名
- 简介
- 代码
- 用法3:继承父注解的属性,并重写属性名
- 简介
- 代码
简介 本文用示例介绍@AliasFor(别名)注解的用法。
用法1:注解的属性互为别名
简介
【SpringBoot中注解@AliasFor的使用详解】它可以注解到自定义注解的两个属性上,表示这两个互为别名,也就是说这两个属性其实同一个含义。
- 其中一个属性名必须是"value"
- 无论指明设置哪个属性名设置属性值,另一个属性名也是同样属性值,也可以缺省属性名。
- 若两个都指明属性值,要求值必须相同,否则会报错。
- 使用简洁。这样使用之后,@MyAnno(location="shanghai")可以直接写为:@MyAnno("shanghai");
若自定义注解有一个属性,且该属性命名上为了体现其含义,调用方必须每次使用自定义注解的时候,都必须写明属性 ,然后设置,这样稍微麻烦。
实例
注解
package com.example.annotation; import org.springframework.core.annotation.AliasFor; import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.TYPE})@Documented@Inheritedpublic @interface MyAnnotation {@AliasFor(attribute = "location")String value() default ""; @AliasFor(attribute = "value")String location() default ""; }
控制器
package com.example.controller; import com.example.annotation.MyAnnotation; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController@RequestMapping("/hello")public class HelloController { @MyAnnotation(value = "https://www.it610.com/article/location")/*//下边这两种写法结果与上边是相同的@MyAnnotation("location")@MyAnnotation(location = "location")*/@RequestMapping("/test1")public String test1() {MyAnnotation myAnnotation = null; try {myAnnotation = AnnotationUtils.getAnnotation(this.getClass().getMethod("test1"), MyAnnotation.class); } catch (NoSuchMethodException e) {e.printStackTrace(); } return"value:" + myAnnotation.value() + "; loation:" + myAnnotation.location(); }}
测试
前端访问:http://localhost:8080/hello/test1
前端结果(value和location都是同一个值)
value:location; loation:location
用法2.继承父注解的属性,不重写属性名 简介
子注解的属性值的读写,其实是对父注解的属性值的读写。(对继承的属性来说)
此时,只能读写继承了的属性值。
代码
注解
package com.example.annotation; import org.springframework.core.annotation.AliasFor; import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.TYPE})@Documented@Inheritedpublic @interface MyAnnotation {@AliasFor(attribute = "location")String value() default ""; @AliasFor(attribute = "value")String location() default ""; }
package com.example.annotation; import org.springframework.core.annotation.AliasFor; import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.TYPE})@Documented@Inherited@MyAnnotationpublic @interface SubMyAnnotation {@AliasFor(annotation = MyAnnotation.class)String location() default ""; //这个不能写,只能有一个与父属性名同名的属性,否则报错//@AliasFor(annotation = MyAnnotation.class)//String value() default ""; }
控制器
package com.example.controller; import com.example.annotation.MyAnnotation; import com.example.annotation.SubMyAnnotation; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController@RequestMapping("/hello")public class HelloController {@SubMyAnnotation(location = "location(my)")@RequestMapping("/test")public String test() {SubMyAnnotation subMyAnnotation = null; MyAnnotation myAnnotation = null; MyAnnotation myAnnotation1 = null; try {subMyAnnotation = AnnotationUtils.getAnnotation(this.getClass().getMethod("test"), SubMyAnnotation.class); myAnnotation = AnnotationUtils.getAnnotation(this.getClass().getMethod("test"), MyAnnotation.class); myAnnotation1 = AnnotatedElementUtils.getMergedAnnotation(this.getClass().getMethod("test"), MyAnnotation.class); } catch (NoSuchMethodException e) {e.printStackTrace(); } return "loation(sub):" + subMyAnnotation.location() + "\n" +"location:" + myAnnotation.location() + "\n" +"location:" + myAnnotation1.location(); }}
测试
前端访问:http://localhost:8080/hello/test
结果
loation(sub):location(my)
location:
location:location(my)
用法3:继承父注解的属性,并重写属性名 简介
子注解的属性值的读写,其实是对父注解的属性值的读写。(对重写的属性来说)
无论指明设置哪个属性名设置属性值,另一个属性名也是同样属性值,不可以缺省属性名。
若两个都指明属性值,要求值必须相同,否则会报错。
代码
注解
package com.example.annotation; import org.springframework.core.annotation.AliasFor; import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.TYPE})@Documented@Inheritedpublic @interface MyAnnotation {@AliasFor(attribute = "location")String value() default ""; @AliasFor(attribute = "value")String location() default ""; }
package com.example.annotation; import org.springframework.core.annotation.AliasFor; import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.TYPE})@Documented@Inherited@MyAnnotationpublic @interface SubMyAnnotation {@AliasFor(attribute = "value", annotation = MyAnnotation.class)String subValue() default ""; @AliasFor(attribute = "location", annotation = MyAnnotation.class)String subLocation() default ""; //subLocation属性写成下边这两种结果是一样的//@AliasFor(attribute = "value", annotation = MyAnnotation.class)//String subLocation() default ""; //@AliasFor(value = "https://www.it610.com/article/location", annotation = MyAnnotation.class)//String subLocation() default ""; //}
控制器
package com.example.controller; import com.example.annotation.MyAnnotation; import com.example.annotation.SubMyAnnotation; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController@RequestMapping("/hello")public class HelloController {@SubMyAnnotation(subValue = "https://www.it610.com/article/subLocation")//@SubMyAnnotation(subLocation = "subLocation")//这个与上边结果相同//@SubMyAnnotation("subLocation")//缺省属性名会报错@RequestMapping("/test")public String test() {SubMyAnnotation subMyAnnotation = null; MyAnnotation myAnnotation = null; MyAnnotation myAnnotation1 = null; try {subMyAnnotation = AnnotationUtils.getAnnotation(this.getClass().getMethod("test"), SubMyAnnotation.class); myAnnotation = AnnotationUtils.getAnnotation(this.getClass().getMethod("test"), MyAnnotation.class); myAnnotation1 = AnnotatedElementUtils.getMergedAnnotation(this.getClass().getMethod("test"), MyAnnotation.class); } catch (NoSuchMethodException e) {e.printStackTrace(); }return "subValue:" + subMyAnnotation.subValue() + "; subLoation:" + subMyAnnotation.subLocation() + "\n" +"value:" + myAnnotation.value() + "; location:" + myAnnotation.location() + "\n" +"value:" + myAnnotation1.value() + "; location:" + myAnnotation1.location(); }}
测试
前端访问:http://localhost:8080/hello/test
结果
subValue:subLocation; subLoation:subLocation以上就是SpringBoot中注解@AliasFor的使用详解的详细内容,更多关于SpringBoot注解@AliasFor的资料请关注脚本之家其它相关文章!
value:; location:
value:subLocation; location:subLocation
推荐阅读
- Python中列表|Python中列表,元组,字典和集合的区别及它们之间的转换
- 安卓手机微信中清除页面缓存的方法
- 使用HoneyBee在Swift中实现高级并发
- netty系列之:netty中常用的对象编码解码器
- 投稿|中年音综之烦恼
- AppStore中使用IDFA后提交应用的注意事项
- IIS在.Net Framework中意外崩溃
- 如何在Windows中查看进程开始时间()
- 在Solaris中使用端口号检查PID
- 2022年5月中国数据库排行榜(openGauss|2022年5月中国数据库排行榜:openGauss 黑马首登顶,AntDB 冲进20强)