Spring---Spring IOC與DI
技術標籤:Spring
什麼是IOC?
控制反轉(Inversion of Control,縮寫為IoC),是面向物件程式設計中的一種設計原則,可以用來減低計算機程式碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查詢”(Dependency Lookup)。通過控制反轉,物件在被建立的時候,由一個調控系統內所有物件的外界實體將其所依賴的物件的引用傳遞給它。也可以說,依賴被注入到物件中。---百度百科
什麼是DI?
所謂依賴注入(Dependency Injection),就是由IOC容器在執行期間,動態地將某種依賴關係注入到物件之中。
舉例:
舉一個現實中的例子,我們要設計汽車:先設計輪子,根據輪子大小設計底盤,然後根據底盤設計車身,最後根據車身設計完成整個汽車。這時候設計汽車的各個步驟間就存在著強依賴關係:汽車依賴車身,車身依賴底盤,底盤依賴輪子。
對應程式碼:
//輪胎類
public class Tire {
private int size;
public Tire(){
this.size=50;
System.out.println("輪胎尺寸為"+size);
}
}
//底盤類 public class Chassis{ private Tire tire; public Chassis(){ this.tire=new Tire(); } }
//車身類
public class Bodywork {
private Chassis chassis;
public Bodywork (){
this.chassis=new Chassis ();
}
}
//測試類
public class Test {
public static void main(String[] args) {
Car mycar=new Car();
mycar.run();
}
}
執行結果:
現在看似沒有任何的問題,但是市場需求變了,要把車輪改大,這樣能提高速度。
對應程式碼:
//輪胎類
public class Tire {
private int size;
public Tire(int size){
this.size=size;
System.out.println("輪胎尺寸為"+size);
}
}
//底盤類
public class Chassis{
private Tire tire;
public Chassis(int size){
this.tire=new Tire(size);
}
}
//車身類
public class Bodywork {
private Chassis chassis;
public Bodywork (int size){
this.chassis=new Chassis (size);
}
}
//測試類
public class Test {
public static void main(String[] args) {
int size=50;
Car mycar=new Car();
mycar.run();
}
}
執行結果:
之前我們是根據輪子大小設計的底盤,此時輪子大小變化,底盤的大小也必須修改,同樣的道理,車身也要進行修改,整體看來,整個設計全部都要修改。很顯然,嚴重違反了開放封閉的設計原則,在實際的專案中,一個類的依賴項可能會有很多,如果要修改,我們可能需要修改成千上萬的類,程式碼維護成本太高,這是不可取的。
如何解決這個問題呢?此時,我們需要進行控制反轉(Inversion of Control),通過依賴注入(Dependency Injection)的方式實現。
//輪胎類
public class Tire {
private int size;
Tire(int size){
this.size=size;
}
}
//底盤類
public class Chassis{
private Tire tire;
Chassis(Tire tire){
this.tire=tire;
}
}
//車身類
public class Bodywork{
private Chassis chassis;
Bodywork(Chassis chassis){
this.chassis=chassis;
}
}
//測試類
public class Test {
public static void main(String[] args) {
mycar.run();
int size=50;
Tire tire=new Tire(size);
Chassis chassis=new Chassis(tire);
Bodywork bodywork=new Bodywork(chassis);
Car mycar=new Car(bodywork);
mycar.run();
}
}
執行結果:
剛剛上面已經公佈了答案,我們是通過依賴注入的方式來實現的控制反轉。其實就是把底層類作為引數傳入上層,從而實現了上層類對下層類的“控制”,讓原本上層依賴下層轉換為下層依賴上層。