SpringBoot中註解@AliasFor的使用詳解
簡介
本文用示例介紹@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的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- springboot如何為web層添加統一請求前綴
- SpringBoot自定義註解開發指南
- 詳解java註解相關知識
- springboot實現對註解的切面案例
- 關於RequestMapping註解的作用說明