下面談談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();
}
}
複製代碼
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