简介
本文用示例介绍@AliasFor(别名)注解的用法。
用法1:注解的属性互为别名
简介
它可以注解到自定义注解的两个属性上,表示这两个互为别名,也就是说这两个属性其实同一个含义。
其中一个属性名必须是"value" 无论指明设置哪个属性名设置属性值,另一个属性名也是同样属性值,也可以缺省属性名。 若两个都指明属性值,要求值必须相同,否则会报错。 使用简洁。这样使用之后,@MyAnno(location="shanghai")可以直接写为:@MyAnno("shanghai");这个功能产生的原因:
若自定义注解有一个属性,且该属性命名上为了体现其含义,调用方必须每次使用自定义注解的时候,都必须写明属性 ,然后设置,这样稍微麻烦。
实例
注解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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 "" ; } |
控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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.继承父注解的属性,不重写属性名
简介
子注解的属性值的读写,其实是对父注解的属性值的读写。(对继承的属性来说)
此时,只能读写继承了的属性值。
代码
注解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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 "" ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 ""; } |
控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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:继承父注解的属性,并重写属性名
简介
子注解的属性值的读写,其实是对父注解的属性值的读写。(对重写的属性来说)
无论指明设置哪个属性名设置属性值,另一个属性名也是同样属性值,不可以缺省属性名。
若两个都指明属性值,要求值必须相同,否则会报错。
代码
注解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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 "" ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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 ""; // } |
控制器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
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
以上就是SpringBoot中注解@AliasFor的使用详解的详细内容,更多关于SpringBoot注解@AliasFor的资料请关注其它相关文章!
原文链接:https://blog.csdn.net/feiying0canglang/article/details/124813465
查看更多关于SpringBoot中注解@AliasFor的使用详解的详细内容...