发布时间:2024-09-16 08:01
本文用示例介绍@AliasFor(别名)注解的用法。
它可以注解到自定义注解的两个属性上,表示这两个互为别名,也就是说这两个属性其实同一个含义。
这个功能产生的原因:
若自定义注解有一个属性,且该属性命名上为了体现其含义,调用方必须每次使用自定义注解的时候,都必须写明属性 ,然后设置,这样稍微麻烦。
注解
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
子注解的属性值的读写,其实是对父注解的属性值的读写。(对继承的属性来说)
此时,只能读写继承了的属性值。
注解
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)
子注解的属性值的读写,其实是对父注解的属性值的读写。(对重写的属性来说)
无论指明设置哪个属性名设置属性值,另一个属性名也是同样属性值,不可以缺省属性名。
若两个都指明属性值,要求值必须相同,否则会报错。
注解
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
以上就是SpringBoot中注解@AliasFor的使用详解的详细内容,更多关于SpringBoot注解@AliasFor的资料请关注脚本之家其它相关文章!