ホームページ > Java > &#&チュートリアル > SpringBoot で @AliasFor アノテーションを使用する方法

SpringBoot で @AliasFor アノテーションを使用する方法

王林
リリース: 2023-05-18 21:46:04
転載
1714 人が閲覧しました

使用法 1: アノテーションの属性は相互のエイリアスです

はじめに

カスタム アノテーションの 2 つの属性にアノテーションを付けることができ、2 つの属性がそれぞれのエイリアスであることを示しますother、つまり this 2 つの属性は実際には同じ意味を持ちます。

  • 属性名の 1 つは「value」である必要があります。

  • 属性値を設定するためにどの属性名を指定しても、もう一方の属性は無効になります。 name も同じ属性値、またはデフォルトの属性名です。

  • 両方の属性値を指定する場合、必要な値は同じである必要があります。そうでない場合は、エラーが報告されます。

  • 簡潔に使用してください。このように使用した後、@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

フロントエンドの結果 (値と場所は両方とも同じ値)

値: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

Result

##subValue:subLocation;subLoation:subLocation

値:;場所:
値:サブロケーション;場所:サブロケーション


以上がSpringBoot で @AliasFor アノテーションを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート