本篇文章小编给大家分享一下SpringBoot中注解@AliasFor代码使用解析,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
用法1:注解的属性互为别名
简介
它可以注解到自定义注解的两个属性上,表示这两个互为别名,也就是说这两个属性其实同一个含义。
其中一个属性名必须是"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 @Inherited public @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 = "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 @Inherited public @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 @MyAnnotation public @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 @Inherited public @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 @MyAnnotation public @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 = "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 = "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
value:;location:
value:subLocation;location:subLocation
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整