カスタム アノテーションの 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 サイトの他の関連記事を参照してください。