Ioc(控制反轉)/DI(依賴注入)

IoC/DI應該是Spring最重要的概念
這是一個抽象的概念
本文盡可能用非常簡單的方式讓讀者入門

IoC, 控制反轉

IoC, 即Inversion of Control
DI, 即Dependency Injection
你的第一個問題必定是:控制什麼?反轉什麼?
結論:你的控制權反轉到Spring了

看一個例子
class Zoo {
    Animal tiger;
    Animal zebra;
    public Zoo() {
        tiger = new Tiger(); // 在Zoo裡面new
        zebra = new Zebra(); // 在Zoo裡面new
        tiger.eat();
        zebra.eat();
    }
}
interface Animal {
    public void eat();
}
class Tiger implements Animal {
    public void eat() {
        System.out.println("老虎吃肉");
    }
}
class Zebra implements Animal {
    public void eat() {
        System.out.println("斑馬吃草");
    }
}
說明:
  • Zoonew Tiger(), new Zebra(),這讓Zoo和Tiger,Zebra有了隅合
  • Spring的設計目標之一是為了解隅,利用依賴抽象而非依賴實例的方式,因此設計了依賴注入(DI)
Spring的寫法
class Zoo {
    @Resource(name="tiger")
    Animal tiger;

    @Resource(name="zebra")
    Animal zebra;

    public Zoo() {
        tiger.eat();
        zebra.eat();
    }
}
interface Animal {
    public void eat();
}
@Component("tiger")
class Tiger implements Animal {
    public void eat() {
        System.out.println("老虎吃肉");
    }
}
@Component("zebra")
class Zebra implements Animal {
    public void eat() {
        System.out.println("斑馬吃草");
    }
}

說明:

  • 只要宣告@Resource,不需再new Tiger(), new Zebra(),剩下的交給Spring完成。
  • 只要在依賴實例的地方,Spring自動會new出來,並幫我們注入,稱依賴注入。並在不需要的時候,自動收回。
  • 因為new的控制權從我們反轉(交給)Spring了,稱為控制反轉(IoC)
  • 上述你會常聽到:用DI來實現IoC

results matching ""

    No results matching ""