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("斑馬吃草");
}
}
說明:
- 在
Zoo
裡new 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