001.Spring | 依賴注入原理分析

下面談談Spring是如何實現反轉模式IoC或依賴注入模式DI: 平時,咱們須要生成一個對象,使用new語法,如一個類爲Ajava

public class A {
      public void m1() {
            System.out.println(this.getClass().getName()+":Hello");
      }
}
複製代碼

若是咱們在 B中調用A,那麼以下代碼:編程

package com.os.test;
//B類中使用A類
public class B {
      //B類中調用A類
      //每一次執行invoke方式,都生成一個A的對象,若是
      //A對象代碼比較長,挺費時費力
      public void invoke() {
            A a = new A();
            a.m1();
      }
}
複製代碼

每次執行invoke方法時,都要生成一個A對象,若是A對象代碼較長,這是費時的事情。因而有以下寫法:設計模式

package com.os.test;
//C類中使用A類
public class C {
      //A類變成了C類中的屬性,可是我不想當即對A進行實例化操做
      //咱們想經過外界傳入A對象,涉及到了涉及模式
      private A a = new A();//不許直接進行初始化操做
      public void invoke() {
            a.m1();
      }
}
複製代碼

將A對象變成C的類屬性。 若是咱們不想在C中實現A的實例,也就是不想當即new A(),而是想經過外界傳入, 注意,若是你想知道爲何,這裏涉及到設計模式以及解耦等因素,進一步感興趣者可學習 23 種設計模式。函數

若是想讓A的實例從外界傳入,有兩種寫法:學習

  • 構造方法
package com.os.test;
//D類中使用A類
public class D {
      private A a ;//我須要給a進行初始化操做
      public D(A a) {//構造方法進行賦值==注入
            this.a = a;
      }
      public void invoke() {
            a.m1();
      }
}
複製代碼
  • setter方式
package com.os.test;
//F類中使用A類
public class F {
      private A a ;//我須要給a進行初始化操做
      public void invoke() {
            a.m1();
      }
      public void setA(A a) {//注入
            this.a = a;
      }    
}
複製代碼

上述兩種寫法在編程中是常常發生的,D(或F)做爲調用者,A是被調用者,A的實例化不在調用者D(或F)內部中完成,而是經過構造函數或setXXX方法賦值進來,這種方式咱們稱爲依賴性注入(DI 或者 IoC 模式),D(或F) 和A 的依賴聯繫是經過構造函數或setXXX 方法賦值進來,這樣, 最大程度解耦了調用者D(或F)和被調用者A之間的耦合聯繫。this

相關文章
相關標籤/搜索