SpringBoot中注解@AliasFor的使用详解

发布时间:2024-09-16 08:01

目录
  • 简介
  • 用法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(\"/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

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

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号