對Spring中ico的認識

IoC的全稱是Inversion of Control,中文翻譯反向控制或者逆向控制。這裏的反向是相對EJB來講的。EJB使用JNDI來查找需要的對象,是主動的,而Spring是把依賴的對象注入給相應的類(這裏涉及到另外一個概念“依賴注入”),是被動的,所以稱之爲“反向”。先看一段代碼,這裏的區別就很容易理解了。

代碼片斷1:

public class Container 
{
    public void init()
    {
    Speaker s = new Speaker();
    Greeting g = new Greeting(s);
    }
}


代碼片段2:

public void greet()
{
Speaker s = new Speaker();
s.sayHello();
}

代碼片段3:

public void greet()
{
Speaker s = (Speaker)context.lookup("ejb/Speaker");
s.sayHello();
}

代碼片段4:

public class Greeting 
{
    public Speaker s;
    public Greeting(Speaker s)
    {
        this.s = s;
    }
    public void greet()
    {
        s.sayHello();
    }
}

我們可以對比一下這三段代碼。其中片段2是不用容器的編碼,片段3是EJB編碼,片段4是Spring編碼。結合代碼片段1,你能看出來Spring編碼的優越之處嗎?

這裏我想先解釋一下“依賴注入”。根據我給的例子可以看出,Greeting類依賴Speaker類。片段2和片段3都是主動的去獲取Speaker,雖然獲取的方式不同。但是片段4並沒有去獲取或者實例化Speaker類,而是在greeting函數中直接使用了s。你也許很容易就發現了,在構造函數中有一個s被注入(可能你平時用的是,傳入)。在哪裏注入的呢?請回頭看一下代碼片段1,這就是使用容器的好處,由容器來維護各個類之間的依賴關係(一般通過Setter來注入依賴,而不是構造函數,我這裏是爲了簡化示例代碼)。Greeting並不需要關心Speaker是哪裏來的或是從哪裏獲得Speaker,只需要關注自己分內的事情,也就是讓Speaker說一句問候的話。

控制反轉的作用和目的就是應該將組件的配置與使用分離開,使其更具條理化,容易適應變化的環境,或者稱爲解耦合。

        組件與服務
      所謂“組件”是指這樣一個軟件單元:它將被作者無法控制的其他應用程序使用,但後者不能對組件進行修改。也就是說,使用一個組件的應用程序不能修改組件的源代碼,但可以通過作者預留的某種途徑對其進行擴展,以改變組件的行爲。
       服務和組件有某種相似之處:它們都將被外部的應用程序使用。在我看來,兩者之間最大的差異在於:組件是在本地使用的(例如JAR 文件、程序集、DLL、或者源碼導入);而服務是要通過——同步或異步的——遠程接口來遠程使用的(例如web service、消息系統、RPC,或者socket)。
       這些輕量級容器則使用了更爲靈活的辦法,只要插件遵循一定的規則,一個獨立的組裝模塊就能夠將插件的具體實現“注射”到應用程序中,這種方法也就被稱爲依賴注入!
       Dependency Injection 模式的基本思想是:用一個單獨的對象(裝配器)來獲得MovieFinder的一個合適的實現,並將其實例賦MovieLister 類的一個字段。
     依賴注入的形式有三種:分別將它們叫做構造子注入(Constructor Injection)、設值方法注入(Setter Injection)和接口注入(Interface Injection)。這三種注入形式分別就是type 1 IoC(接口注入)、type 2 IoC(設值方法注入)和type 3 IoC(構造子注入)

發佈了31 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章