在編寫 SpringMVC Demo 的過程當中,對自動裝配有一種莫名的興奮感,只要容器中有相對應的 Bean ,經過 @Autowire 註解,自動會將對應的 Bean 注入到相關的屬性中,着的確是一個很強大的機制,可是在使用的過程當中,也遇到了許多問題,其中有一個是,若是這個屬性的類型有多個實現 Bean,那應該注入哪個Bean呢,翻了不少資料也沒有,只可以本身看源碼,找答案。ide
Java 對自動裝配的支持測試
JDK1.5以前尚未註解功能,在1.5版本才正式加入了對註解機制的支持。
註解至關於一種標記,容許程序在運行時動態地對擁有該標記的成員進行操做。
百度百科裏對註解功能的解釋是:編碼
編寫文檔:經過代碼裏標識的元數據生成文檔【生成文檔doc文檔】code
代碼分析:經過代碼裏標識的元數據對代碼進行分析【使用反射】element
編譯檢查:經過代碼裏標識的元數據讓編譯器可以實現基本的編譯檢查【Override】文檔
所以 Spring基於 JDK1.5,實現了註解功能。get
那麼如今咱們經過自行編碼,簡單實現 Spring 自動裝配的功能:編譯器
自定義註解:源碼
/** * 自定義註解,用來配置方法 */ @Retention(RetentionPolicy.RUNTIME) // 表示註解在運行時依然存在 @Target(ElementType.METHOD) // 表示註解能夠被使用於方法上 public @interface SayHiAnnotation { String paramValue() default "johness"; // 表示個人註解須要一個參數名爲"paramValue" 默認值爲"johness"
自動裝配:io
/** * 要使用SayHiAnnotation的元素所在類 * 因爲咱們定義了只有方法才能使用咱們的註解,咱們就使用多個方法來進行測試 */ public class SayHiEmlement { // 普通的方法 public void SayHiDefault(String name){ System.out.println("Hi, " + name); } // 使用註解並傳入參數的方法 @SayHiAnnotation(paramValue="Jack") public void SayHiAnnotation(String name){ System.out.println("Hi, " + name); } // 使用註解並使用默認參數的方法 @SayHiAnnotation public void SayHiAnnotationDefault(String name){ System.out.println("Hi, " + name); } }
測試代碼:
public class AnnotionOperator { public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException { SayHiEmlement element = new SayHiEmlement(); // 初始化一個實例,用於方法調用 Method[] methods = SayHiEmlement.class.getDeclaredMethods(); // 得到全部方法 for (Method method : methods) { SayHiAnnotation annotationTmp = null; if((annotationTmp = method.getAnnotation(SayHiAnnotation.class))!=null) // 檢測是否使用了咱們的註解 method.invoke(element,annotationTmp.paramValue()); // 若是使用了咱們的註解,咱們就把註解裏的"paramValue"參數值做爲方法參數來調用方法 else method.invoke(element, "Rose"); // 若是沒有使用咱們的註解,咱們就須要使用普通的方式來調用方法了 } }
測試結果:
SayHiAnnotation()//Hi, Jack SayHiAnnotationDefault() //Hi, johness SayHiDefault()//Hi, Rose
能夠看出,Spring 則是基於註解和反射 自行自動裝配