好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringBoot中注解@AliasFor的使用详解

简介

本文用示例介绍@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的使用详解的详细内容...

  阅读:16次