SpringBoot中注解@AliasFor的使用详解(springbootapplication注解)

网友投稿 393 2022-07-29


目录简介用法1:注解的属性互为别名简介实例用法2.继承父注解的属性,不重写属性名简介代码用法3:继承父注解的属性,并重写属性名简介代码

简介

本文用示例介绍@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("/testsDFbciu1")

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" +

"http://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:subLocationvalue:;location:value:subLocation;location:subLocation

以上就是SpringBoot中注解@AliasFor的使用详解的详细内容,更多关于SpringBoot注解@AliasFor的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring Cloud Eureka基础应用及原理
下一篇:分享令人目瞪口呆的 Java 代码技巧
相关文章

 发表评论

暂时没有评论,来抢沙发吧~