依賴注入的前提:
有IOC的環境,也就是將必須對象的創建權交給了Spring.
DI 介紹
Dependency Injection 依賴注入.需要有IOC 的環境,Spring 創建這個類的過程中,Spring 將類的依賴的屬性設置進去.
IOC與DI的的區別:
IOC: 控制反轉,將類的對象的創建交給Spring類管理創建.
DI: 依賴注入,將類里面的屬性在創建類的過程中給屬性賦值.
DI和IOC的關系: DI不能單獨存在,DI需要在IOC的基礎上來完成.
這樣做得好處:做到了單一職責,並且提高了復用性,解耦了之后,任你如何實現,使用接口的引用調用的方法,永遠不需要改變
舉一個栗子:
寫個接口,說咱們購物去~
public interface IShopping { void drive(); String Money(); }
在實現它兩下:有錢人購物,沒錢人購物 - -!這栗子舉的
public class RichMan implements IShopping{ @Override public void drive() { System.out.println("Drive By Benz"); } @Override public String Money() { System.out.println("lot`s of money"); return "10000"; } }
public class PoorGuy implements IShopping{ @Override public void drive() { System.out.println("take a walk!"); } @Override public String Money() { System.out.println("nothing"); return "1"; } }
然后我們出去玩,順便shopping一下吧~
public class Play { private IShopping shoppingSomething;
//使用構造方法,將實現傳入 public Play(IShopping shoppingSomething){ this.shoppingSomething = shoppingSomething; } public void withgirlFriend(){ shoppingSomething.drive(); shoppingSomething.Money(); }
}
將想用的實現方式,用容器注入進來,這里就模擬下下怎么注入:
public class Containner { public Play getShopping(){ return new Play(new RichMan()); } }
測試一下:
public static void main(String[] args) { Containner containner = new Containner(); Play play = containner.getShopping(); play.withgirlFriend(); }
結果是:
Drive By Benz
lot`s of money
如果再依賴注入的配置時,配置為窮人的實現,那我們的代碼都不用變,結果就會改變~