Maison >Java >javaDidacticiel >Comment utiliser l'annotation @AliasFor dans SpringBoot

Comment utiliser l'annotation @AliasFor dans SpringBoot

王林
王林avant
2023-05-18 21:46:041676parcourir

Utilisation 1 : Les attributs de l'annotation sont des alias les uns pour les autres

Introduction

Il peut être annoté avec deux attributs de l'annotation personnalisée, indiquant que les deux les attributs sont des alias l'un pour l'autre, c'est-à-dire que ces deux attributs ont en réalité la même signification.

  • L'un des noms d'attribut doit être "valeur"

  • Peu importe le nom d'attribut spécifié set, définissez la valeur de l'attribut, un autre nom d'attribut est également la même valeur d'attribut, ou le nom d'attribut par défaut peut être utilisé.

  • Si les deux spécifient des valeurs d'attribut, les valeurs requises doivent être les mêmes, sinon une erreur sera signalée.

  • Simple à utiliser. Après l'avoir utilisé ainsi, @MyAnno(location="shanghai") peut être écrit directement comme : @MyAnno("shanghai");

La raison de cette fonction : #🎜 🎜#

Si l'annotation personnalisée a un attribut et que l'attribut est nommé pour refléter sa signification, l'appelant doit écrire l'attribut puis le définir à chaque fois qu'il utilise l'annotation personnalisée, ce qui est un peu gênant .

Instance

Annotation

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 "";
}

Controllerr rriee # 🎜🎜#

Test

Accès front-end : http://localhost:8080/hello/test1

Résultats front-end (les deux la valeur et l'emplacement sont la même valeur)

value:location;loation:location

Usage 2. Hériter des attributs de l'annotation parent et ne réécrivez pas le nom de l'attribut

Introduction

Lire et écrire la valeur d'attribut de l'annotation enfant revient en fait à lire et écrire la valeur d'attribut de l'annotation parent. (Pour les propriétés héritées)

Pour le moment, seules les valeurs des propriétés héritées peuvent être lues et écrites.

code

note

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();
    }
}
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 "";
}

controller

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 "";
}
# 🎜🎜#test

Accès front-end : http://localhost:8080/hello/test

result# 🎜 🎜#

loation(sub):location(my)location:

location:location(my)

#🎜 🎜 #Utilisation 3 : Hériter des attributs de l'annotation parent et réécrire le nom de l'attribut

Introduction

La lecture et l'écriture de la valeur de l'attribut de l'annotation enfant sont en fait l'attribut valeur de l'annotation parent Lire et écrire. (Pour les attributs remplacés)

Peu importe le nom d'attribut spécifié pour définir la valeur d'attribut, l'autre nom d'attribut aura également la même valeur d'attribut et le nom d'attribut par défaut ne pourra pas être utilisé.

Si les deux spécifient des valeurs d'attribut, les valeurs requises doivent être les mêmes, sinon une erreur sera signalée.

code

note

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();
    }
}
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 "";
}

controller

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 "";
//
}
# 🎜🎜#

test

Accès front-end : http://localhost:8080/hello/test

result# 🎜 🎜#

subValue:subLocation;subLoation:subLocation

value:;location:

value:subLocation;location:subLocation

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer