SpringMVC:Spring 自動裝配實現的基本原理

  在編寫 SpringMVC Demo 的過程當中,對自動裝配有一種莫名的興奮感,只要容器中有相對應的 Bean ,經過 @Autowire 註解,自動會將對應的 Bean 注入到相關的屬性中,着的確是一個很強大的機制,可是在使用的過程當中,也遇到了許多問題,其中有一個是,若是這個屬性的類型有多個實現 Bean,那應該注入哪個Bean呢,翻了不少資料也沒有,只可以本身看源碼,找答案。ide

  • Java 對自動裝配的支持測試

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 則是基於註解和反射 自行自動裝配

相關文章
相關標籤/搜索