不管開發web仍是後端,都會常常和spring打交道,而使用最頻繁的固然是註解。咱們在享受spring註解帶來的方便的同時,是否想過可否實現本身的註解呢?咱們經過java的原生態類就能夠作到這點,咱們主要關注java.lang.annotation。java
如下是實現的代碼,註解已經很詳細了。這裏咱們主要考慮,自定義註解能夠幹什麼?web
咱們能夠利用自定義註解來無縫切換數據庫,好比說定義一個@datasource的註解,而後作一個aop,在調用方法時,例如反射機制讀取數據源的名稱,而後作一個threadlocal來切換數據源,是否是很方便。關於數據源的切換,下一章介紹。spring
/** * 描述: 自定義註解 * 版本號: 1.0 * 日期: 2017/2/20 16:47 * 做者: 屠蘇 * <ul>@Target:表示該註解能夠用於什麼地方,可能的ElementType參數:</ul> * <li>CONSTRUCTOR:構造器的聲明</li> * <li>LOCAL_VARIABLE:局部變量聲明</li> * <li>METHOD:方法聲明</li> * <li>PACKAGE:包聲明 PARAMETER:參數聲明</li> * <li>TYPE:類、接口(包括註解類型)或enum聲明</li> * * <ul>@Retention:表示須要在什麼級別保存該註解信息。可選的RetentionPolicy參數包括:</ul> * <li>SOURCE:註解將被編譯器丟棄</li> * <li>CLASS:註解在class文件中可用,但會被JVM丟棄</li> * <li>RUNTIME:JVM將在運行期間保留註解,所以能夠經過反射機制讀取註解的信息。(經常使用)</li> * * <ul>@Document:將註解包含在Javadoc中</ul> * * <ul>@Inherited:容許子類繼承父類中的註解</ul> * * <ul>注意:</ul> * <li>註解能夠設定初始值,使用default就能夠實現。</li> * <li>註解只有一個元素的時候,該元素名稱必須是value,而且在使用該註解的時候能夠省略」value=」。</li> * <li>註解的值必須是肯定的,且不能使用null做爲值。</li> * <li>註解可能的類型:全部基本類型、String、Class、enum、Annotation、以上類型的數組形式。</li> */ @Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface SelfNote { String id(); String note() default "hello"; }
package com.dlb.annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * 描述: 使用自定義註解 * 版本號: 1.0 * 日期: 2017/2/20 16:53 * 做者: 屠蘇 */ @SelfNote(id = "no", note = "note") public class Note { @SelfNote(id = "no1", note = "note1") private String name; @SelfNote(id = "no2", note = "note2") public void setName(String name) { this.name = name; } /** * main * @param args * @throws Exception */ public static void main(String []args) throws Exception{ String classReference = "com.dlb.annotation.Note"; Class<?> cls = Class.forName(classReference); // 獲取類 boolean b = cls.isAnnotationPresent(SelfNote.class); if (b) { SelfNote annotation = cls.getAnnotation(SelfNote.class); System.out.println(annotation.id() + "," + annotation.note()); } // 獲取字段 Field[] declaredFields = cls.getDeclaredFields(); for (Field field : declaredFields) { boolean isFieldAn = field.isAnnotationPresent(SelfNote.class); if (isFieldAn) { SelfNote annotation = field.getAnnotation(SelfNote.class); System.out.println(annotation.id() + "," + annotation.note()); } } // 獲取方法 Method[] methods = cls.getMethods(); for (Method method : methods) { boolean is = method.isAnnotationPresent(SelfNote.class); if (is) { SelfNote annotation = method.getAnnotation(SelfNote.class); System.out.println(annotation.id() + "," + annotation.note()); } } } }