一、背景
1、Annotation:
提供了一種為程序元素設置元數據的方法,可用於修飾包、類、構造器、方法、成員變量、參數和局部變量(具體詳見元注解 Target)的聲明。
注解可以被一些解析工具或者是編譯工具進行解析。
Annotation中的信息可以在編譯、加載和運行時被讀取(具體詳見元注解 Retention),並執行相應的處理。
2、Metadata:
中介數據、中繼數據,為描述數據的數據(data about data),主要是描述數據屬性(property)的信息,用來支持如指示存儲位置、歷史數據、資源查找、文件記錄等功能。
指從信息資源中抽取出來的用於說明其特征、內容的結構化的數據(如題名、版本、出版數據、相關說明、檢索點等),用於組織、描述、檢索、保存、管理信息和知識資源。
任何文件系統中的數據都分為數據和元數據。數據是指普通文件中的實際數據,而元數據指用來描述一個文件的特征的系統數據,諸如訪問權限、文件擁有者以及文件數據塊的分布信息(inode…)等等。在集群文件系統中,分布信息包括文件在磁盤上的位置以及磁盤在集群中的位置。用戶需要操作一個文件必須首先得到它的元數據,才能定位到文件的位置並且得到文件的內容或相關屬性。
HTML的head里有一個meta標簽。meta的屬性有兩種(name、http-equiv),name屬性用來描述網頁的內容,http-equiv屬性指示服務器在發送實際的文檔之前先在要傳送給瀏覽器的 MIME 文檔頭部包含名稱/值對,比如用以說明主頁制作所使用的文字以及語言。
3、XML:
XML被廣泛的應用於描述元數據。
4、XML vs Annotation:
- xml 作為可擴展標記語言最大的優勢在於開發者能夠為軟件量身【定制】適用的標記,使代碼更加通俗易懂。
- 利用 xml 配置能使軟件更具擴展性。例如 Spring 將 class 間的依賴配置在 xml 中,最大限度地提升應用的可擴展性。
- 具有成熟的驗證機制確保程序正確性。利用 Schema 或 DTD 可以對 xml 的正確性進行驗證,避免了非法的配置導致應用程序出錯。
- 修改配置而無需變動現有程序。
- 需要解析工具或類庫的支持。
- 解析 xml 勢必會影響應用程序性能,占用系統資源。
- 配置文件過多導致管理變得困難。
- 編譯期無法對其配置項的正確性進行驗證,或要查錯只能在運行期。
- IDE 無法驗證配置項的正確性。
- 查錯變得困難,往往配置的一個手誤導致莫名其妙的錯誤。
- 開發人員不得不同時維護代碼和配置文件,開發效率變得低下。
- 配置項與代碼間存在潛規則。改變了任何一方都有可能影響另外一方。
- 保存在 class 文件中,降低維護成本。
- 無需工具支持,無需解析。
- 編譯期即可驗證正確性,查錯變得容易。
- 提升開發效率。
- 若要對配置項進行修改,不得不修改 Java 文件,重新編譯打包應用。
- 配置項編碼在 Java 文件中,可擴展性差。
二、注解
1、@interface:定義一個Annotation類型的接口,可以包含成員變量。
- Annotation的成員變量以無形參的方法形式來聲明,其方法名和返回值定義了該成員變量的名字和類型。
- 使用帶有屬性的Annotation時,必須為其屬性指定值,否則會報錯。
- 定義Annotation時可以使用【default】關鍵字為屬性設置默認值。
- 如果Annotation中具有名為【value】的屬性,在使用時如果只使用value屬性的話,可以不寫屬性名直接指定值。
- Annotation的屬性類型只能是基本類型、String、enum、Class及上述類型的一維數組類型。
- 對於數組類型,當數組中只有一個元素時,可以省略大括號。
2、meta-annotation:
四個原注解(@Target、@Retention、@Documented、@Inherited),注解其他注解。
Java5.0定義了4個標准的 meta-annotation 類型,它們被用來提供對其它 annotation 類型作說明(只能作用在注解上,不能作用在其他程序元素上)。
2.1、@Target:元素種類,指示注解類型所適用的程序元素的種類。由 ElementType 限定。
- ElementType.TYPE:注解到接口、類、枚舉、注解上
- ElementType.FIELD:注解到屬性字段、枚舉的常量上
- ElementType.METHOD:注解到方法上
- ElementType.PARAMETER:注解到方法參數上
- ElementType.CONSTRUCTOR:注解到構造方法上
- ElementType.LOCAL_VARIABLE:注解到局部變量上
- ElementType.ANNOTATION_TYPE:注解到注解類型元素的聲明上(表明為原注解)
- ElementType.PACKAGE:注解到包上
- ElementType.TYPE_PARAMETER:注解到@since 1.8上
- ElementType.TYPE_USE:注解到@since 1.8上
2.2、@Retention:保留策略【重要】
指示注解類型的注解要保留多久。如果注解類型聲明中不存在 Retention 注解,則保留策略默認為 RetentionPolicy.CLASS。
-
- RetentionPolicy.SOURCE:注解保留在源代碼中,但是編譯的時候會被編譯器所丟棄。
- RetentionPolicy.CLASS:默認,注解會被保留在class文件中,但是在運行時期間就不會識別這個注解。
- RetentionPolicy.RUNTIME:注解會被保留在class文件中,同時運行時期間也會被識別。所以可以使用反射機制獲取注解信息。
- RetentionPolicy.SOURCE:注解保留在源代碼中,但是編譯的時候會被編譯器所丟棄。
2.3、@Documented:文檔化
指示某一類型的注釋將通過 javadoc 和類似的默認工具進行文檔化。
一個類型的聲明是用 @Documented 來注解的,則其注解將成為注解元素的公共 API 的一部分。
2.4、@Inherited:自動繼承
說明子類可以繼承父類中的該注解。
指示注解類型被自動繼承。如果在注解類型聲明中存在 Inherited 元注解,並且用戶在某一類聲明中查詢該注解類型,同時該類聲明中沒有此類型的注解,則將在該類的超類中自動查詢該注解類型。此過程會重復進行,直到找到此類型的注解或到達了該類層次結構的頂層 (Object) 為止。如果沒有超類具有該類型的注解,則查詢將指示當前類沒有這樣的注解。
sda