我們在實際開發的時候,會使用到很多的注解,特別是使用Spring或者Spring家族時,會大量的使用注解,那我們有沒有想過Spring的這些注解都是怎么實現的呢?為什么加了這些注解就會有對應的效果呢?以及如果我們自己要實現注解?步驟和方法有哪些呢?
1.注解是什么? 注解(Annotation)也叫元數據,用於對代碼進行說明,可以對包、類、接口、字段、方法參數、局部變量等進行注解。其實說白就是代碼里的特殊標志,這些標志可以在編譯,類加載,運行時被讀取,並根據這些信息執行相應的處理,以便於其他工具補充信息或者進行部署。
元數據(Metadata),又稱中介數據、中繼數據,為描述數據的數據(data about data),主要是描述數據屬性(property)的信息,用來支持如指示存儲位置、歷史數據、資源查找、文件記錄等功能。
如果說注釋是寫給人看的,那么注解就是寫給程序看的。它更像一個標簽,貼在一個類、一個方法或者字段上。它的目的是為當前讀取該注解的程序提供判斷依據。比如程序只要讀到加了@Test的方法,就知道該方法是待測試方法,又比如@Before注解,程序看到這個注解,就知道該方法要放在@Test方法之前執行。
1.1 注解的類型 一般常用的注解可以分為三類:
-
元注解,元注解是用於定義注解的注解,包括@Retention(標明注解被保留的階段)、@Target(標明注解使用的范圍)、@Inherited(標明注解可繼承)、@Documented(標明是否生成javadoc文檔)。
-
Java自帶的標准注解,包括@Override(標明重寫某個方法)、@Deprecated(標明某個類或方法過時)和@SuppressWarnings(標明要忽略的警告),使用這些注解后編譯器就會進行檢查。
-
自定義注解,可以根據自己的需求定義注解。
1.2.注解配置和xml配置的關系 我們知道Spring早期是使用xml來進行配置的,現在更推薦注解配置,那么xml配置和注解配置的區別是什么呢?
我們可以認為xml和注解都是元數據。
xml: 是一種集中式的元數據,與源代碼無綁定。
注解:是一種分散式的元數據,與源代碼緊綁定。
1.3 注解的作用 生成文檔,通過代碼里標識的元數據生成javadoc文檔。
編譯檢查,通過代碼里標識的元數據讓編譯器在編譯期間進行檢查驗證。
編譯時動態處理,編譯時通過代碼里標識的元數據動態處理,例如動態生成代碼。
運行時動態處理,運行時通過代碼里標識的元數據動態處理,例如使用反射注入實例。
2.注解實現 2.1 實現注解的步驟 (1).聲明注解
(2).添加注解
(3). 獲取添加了注解的目標。通常是Class對象,Method對象,Field對象,還有Constructor對象,Parameter對象,Annotation對象等
a.通過已知對象,獲取Class對象
b.通過全類路徑,獲取Class對象
c.掃描包路徑,獲取Class對象
(4).實現注解處理器。借助反射,獲取注解對象,讀取注解屬性值, 然后根據注解及屬性值做相應處理