是 JAVA Spring 中一項重要的觀念, 在這就做個簡介順便當作筆記。
一般流程
在講 IoC 之前先來敘述一般的流程, 以例子解說, 假設今天有位 driver 要開一台車出門
public class Driver{
private BMW car = new BMW(); //reference 到一個 BMW 物件
public void drive(){
car.startRunning();
}
}
public class BMW {
public void startRunning() {
System.out.println("Driver start to drive BMW...");
}
}
其中 Driver 這個 class 控制了想要開哪種車子
BMW car = new BMW();
假設今天 Driver 不想開 BMW 想開 Benz 則必須主動更改 class 內容
Benz car = new Benz(); 以及新增 Benz 的 class
此種關聯相依的型式取決於 class 本身,今天我想開 BMW 就在 class 中 new BMW
改天想開 Benz 就在 class 中 new Benz
首先建立介面
BMW car = new BMW();
假設今天 Driver 不想開 BMW 想開 Benz 則必須主動更改 class 內容
Benz car = new Benz(); 以及新增 Benz 的 class
此種關聯相依的型式取決於 class 本身,今天我想開 BMW 就在 class 中 new BMW
改天想開 Benz 就在 class 中 new Benz
依賴注入
DI 也就是 IoC, 其實講 DI 比較好懂, 因為在一開始 driver 並不指定要選什麼車種, 等待使用者將 class 注入其中首先建立介面
public interface Car {
public void startRunning();
}
而在 driver 的 class 中直接引用此 interface
public class Driver {
private Car car;
public Driver () {}
public Driver (Car car) {
this.car = car;
}
public void drive(){
car.startRunning();
}
public void setCar(Car car) {
this.car = car;
}
}
然後由調用 driver 的人來選擇今天想開什麼車再把依賴住入
public class Test {當然以上調用 BMW 或是 Benz 必須實作 Car 這個 interface 在這沒有再綴述
public static void main(String[] args) {
Driver driver = new Driver();
driver.setCar(new BMW()); //driver 要開 BMW
driver.drive();
driver.setCar(new Benz()); //driver 換開 Benz
driver.drive();
}
}
上面此中方式由上層程式來決定今天 driver 要開哪台車子, 而不是 driver class 本身就寫死, 此種調用觀念則稱做 DI 也就是 IoC
IoC Type
IoC 有三種 Type
- interface injection
- setting injection
- constructor injection
第2種 setting injection 透過 bean
<bean id="bmw" class="xxx.xxx.Bmw" />
<bean id="driver" class="xxx.xxx.Driver">
<property name="car" ref="bmw" />
</bean>
第3種 constructor injection
<bean id="driver" class="xxx.xxx.Driver">
<constructor-arg ref="bmw"/>
</bean>
IoC 的簡易觀念大概就先這樣, 未來持續讓我們一同進步吧 fight
Ref:
http://www.360doc.com/content/08/0113/20/7635_970484.shtml
沒有留言:
張貼留言