網頁

2014年11月5日 星期三

Java 重要觀念 Spring IoC

IoC (Inversion of Control) 反轉控制、也稱做DI (dependency injection)
是 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


依賴注入

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 {
    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();

    }
}
當然以上調用 BMW 或是 Benz 必須實作 Car 這個 interface 在這沒有再綴述
上面此中方式由上層程式來決定今天 driver 要開哪台車子, 而不是 driver class 本身就寫死, 此種調用觀念則稱做 DI 也就是 IoC

IoC Type


IoC 有三種 Type
  1. interface injection
  2. setting injection
  3. constructor injection
其中上面範例直接透過 interface 就是第1種 interface 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://programer-learn.blogspot.tw/2011/09/spring-ioc.html
http://www.360doc.com/content/08/0113/20/7635_970484.shtml

沒有留言:

張貼留言