6. Spring:Java註解技術詳解
6. Spring:Java註解技術詳解
自定義註解示例:https://blog.csdn.net/wangpengzhi19891223/article/details/78131137/
-
Java註解技術基本概念
Annotation是Java5開始引入的新特徵。中文名稱一般叫註解。它提供了一種安全的類似註釋的機制,用來將任何的資訊或元資料(metadata)與程式元素(類、方法、成員變數等)進行關聯
-
原理
註解其實是一種介面,通過Java反射機制相關的API來訪問註解的資訊。
註解不會影響程式的執行
-
和介面的區別
-
註解是使用的關鍵字@interface而不是interface,是繼承了java.lang.annotation.interface
並非聲明瞭一個介面
-
註解型別方法定義是受限制的,獨特的。
-
可以定義常量
-
-
應用場合
- 工具類,工具框架中
-
-
Java標準註解
-
Override
標註過載了父類的方法(如果標註在不是覆蓋父類的方法上,會編譯錯誤)
-
Deprecate
標註此方法已過時
-
SuppressWarnings
遮蔽警告
@SuppressWarnings(value={"unchecked","fallthrough"}) public void test
-
-
Java元註解
元註解:負責註解其他註解的註解
Java5.0定義了4個標準的meta-annotation型別,它們被用來提供對其它 annotation型別作說明,Java5.0定義的元註解有以下四種類型:
-
@Target
@Target主要作用是用於描述註解的使用範圍,即被描述的註解可以用在什麼地方
-
作用範圍
- CONSTRUCTOR
- FIELD
- LOCAL_VARIABLE
- METHOD
- PACKAGE
- PARAMETER
- TYPE
-
示例
@Target(ElementType.TYPE) public @interface Table { public String tableName() default "className"; } // Table註解可以用來註解類,介面,型別,列舉宣告 @Target(ElementType.FIELD) public @interface NoDBColumn { } // NoDBColumn僅用來類的成員變數
-
-
@Retention
Retention主要表示需要在什麼級別儲存該註釋資訊,用於描述註解的生命週期
-
描述生命週期(註解在什麼範圍內有效)
- SOURCE:原始檔中是有效的,原始檔中是保留的
- CLASS:CLASS檔案中是有效的
- RUNTIME:在執行時有效,執行時保留
-
示例
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { public String name() default "fieldName"; public String setFuncName() default "setField"; public String getFuncName() default "getField"; public boolean defaultDBValue() default false; }
-
-
@Documented
@Documented用於描述其它型別的annotation應該被作為被標註的程式成員的公共API,因此可以被例如javadoc此類的工具文件化
-
示例
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Column { public String name() default "fieldName"; public String setFuncName() default "setField"; public String getFuncName() default "getField"; public boolean defaultDBValue() default false; }
-
-
@Inherited
@Inherited 元註解是一個標記註解,@Inherited闡述了某個被標註的型別是被繼承的。如果一個使用了@Inherited修飾的annotation型別被用於一個class,則這個annotation將被用於該class的子類:
-
示例
@Inherited public @interface Greeting { public enum FontColor{ BULE,RED,GREEN}; String name(); FontColor fontColor() default FontColor.GREEN; }
-
-
-
Java自定義註解
-
步驟
-
通過@interface關鍵字宣告註解名稱、註解成員屬性等
-
使用Java內建四個元註解對自定義標註的功能和範圍進行約束
自定義註解的格式: public @interface 註解名 { 定義體 }
-
-
支援的資料型別
- 所有基本資料型別
- String 型別
- Class 型別
- enum 型別
- Annotation 型別
- 以上所有型別的陣列
-
自定義註解定義:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitName { String value() default ""; }
-
自定義註解的使用
public class Apple { @FruitName("Apple") private String appleName; // …… }
-
-
註解元素預設值
註解元素的預設值:註解元素必須有確定的值,要麼在定義註解的預設值中指定,要麼在使用註解時指定,非基本型別的註解元素的值不可為null:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitProvider { //供應商編號 public int id() default -1; //供應商名稱 public String name() default ""; //供應商地址 public String address() default ""; }