spring:Inversion of Control具體實現【資料蒐集】

IoC(Inversion of Control)控制反轉的具體表現爲以下幾點:
高層模塊不應該依賴底層模塊,而是模塊都必須依賴於抽象。
實現必須依賴抽象,而不是抽象依賴實現。
如果高層模塊直接執行底層模塊的函數,就對底層模塊產生了依賴關係。
在設計上希望模塊都依賴與模塊的抽象,這樣纔可以重用高層的應用程序設計。
public class Business{
private FloppyWriter writer = new FloppyWriter();
...
public void save(){
...
writer.saveToFloppy();
}
}
Business類的設計中,存盤的需求依賴於實際的FloppyWriter對象,如果今天想要將存儲介質換爲USB磁盤,則必須修改Business的程序,您無法直接重複使用Business類。
如果透過接口的聲明,可以改進這種情況,例如可先定義一個IDeviceWriter接口:
public interface IDeviceWriter{
public void saveToDevice();
}
接着所設計的Business類,在遇到存盤需求時,可以設計爲依賴與IDevice接口,而不是依賴於實際的FloppyWriter,例如:
public class Business{
private IDeviceWriter writer;

public void setDeviceWriter(IDeviceWriter writer){
this.writer = writer;
}

public void save(){
...
writer.saveToDevice();
}
}
在這樣的設計下,Business類就是可以重用的,如果今天有存儲至Floppy或USB磁盤的需求,只要針對這兩種儲存需求分別實現接口即可,例如針對Floppy存儲設計一個FloppyWriter類:
public class FloppyWriter implements IDeviceWriter{
public void saveToDevice(){
...
//實際存儲至Floppy的程序代碼
}
}
或是針對USB磁盤存儲設計一個UsbDiskWriter類:
public class UsbDiskWriter implements IDeviceWriter{
public void saveToDevice(){
...
//實際存儲至UsbDisk的程序代碼
}
如果應用程序需要Floppy存儲的話,可以編寫一個配置程序如下:
Business business = new Business();
business.setDeviceWriter(new FloppyWriter());
business.save();
同樣的,如果應用程序需要USB磁盤的話,可以編寫一個配置程序如下:
Business business = new Business();
business.setDeviceWriter(new UsbDiskWriter());
business.save();
IoC要求的是容器不應該(或儘量不要)侵入應用程序,也就是不應該出現與容器相依的API,應用程序本身可以依賴於抽象的接口,容器可以透過這些抽象接口將所需的資源注入至應用程序中,應用程序不向容器主動要求資源,故而不會依賴於容器的特定API,應用程序本身不會意識到正被容器使用,可以隨時從容器系統中脫離,轉移至其他的容器或框架而不用作任何的修改。
IoC模式基本上是一個高層的模式概念,在Martin Fowler的Inversion of Control Containers and the Dependency Injection pattern中談到,實現IoC有兩種方式:Dependency Injection 與Service Locator,Spring所採用的是Dependency Injection來實現IoC,中文翻譯爲依賴注入。
Spring的核心是個IoC容器,可以用Setter或構造函數的方式來實現您的應用程序對象,至於對象與獨享之間的關係建立,則可以透過配置文件設定(一個XML文件或是一個.properies文件),讓Spring在執行時期根據配置文件的設定,爲您建立對象之間的依賴關係,您不必特地編寫一些程序來自行建立這些對象之間的依賴關係,這不僅減少大量的程序編寫,也降低了對象之間的耦合程度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章