天天看點

從spring的IOC說起(一)

   這段時間也着實好好的看了下spring的相關書籍,對其也有了大概和初步的認識和了解,雖然之前也一直聽說spring是一個非常優秀的開源架構,可一直沒有機會學習和使用(是不是有點落伍了?呵呵),是以呢,這段時間就重點學習了spring(一個星期的時間當然是入門級的啦~~)

    大家一直都說spring的IOC如何如何的強大,其實我倒覺得不是IOC如何的強大,說白了IOC其實也非常的簡單。我們先從IOC說起,這個概念其實是從我們平常new一個對象的對立面來說的,我們平常使用對象的時候,一般都是直接使用關鍵字類new一個對象,那這樣有什麼壞處呢?其實很顯然的,使用new那麼就表示目前子產品已經不知不覺的和new的對象耦合了,而我們通常都是更高層次的抽象子產品調用底層的實作子產品,這樣也就産生了子產品依賴于具體的實作,這樣與我們JAVA中提倡的面向接口面向抽象程式設計是相沖突的,而且這樣做也帶來系統的子產品架構問題。很簡單的例子,我們在進行資料庫操作的時候,總是業務層調用DAO層,當然我們的DAO一般都是會采用接口開發,這在一定程度上滿足了松耦合,使業務邏輯層不依賴于具體的資料庫DAO層。但是我們在使用的時候還是會new一個特定資料庫的DAO層,這無形中也與特定的資料庫綁定了,雖然我們可以使用抽象工廠模式來擷取DAO實作類,但除非我們一次性把所有資料庫的DAO寫出來,否則在進行資料庫遷移的時候我們還是得修改DAO工廠類。

    那我們使用IOC能達到什麼呢?IOC,就是DAO接口的實作不再是業務邏輯層調用工廠類去擷取,而是通過容器(比如spring)來自動的為我們的業務層設定DAO的實作類。這樣整個過程就反過來,以前是我們業務層主動去擷取DAO,而現在是DAO主動被設定到業務邏輯層中來了,這也就是反轉控制的由來。通過IOC,我們就可以在不修改任何代碼的情況下,無縫的實作資料庫的換庫遷移,當然前提還是必須得寫一個實作特定資料庫的DAO。我們把DAO普遍到更多的情況下,那麼IOC就為我們帶來更大的友善性,比如一個接口的多個實作,我們隻需要配置一下就ok了,而不需要再一個個的寫工廠來來擷取了。這就是IOC為我們帶來的子產品的松耦合和應用的便利性。

    那為什麼說IOC很簡單呢?說白了其實就是由我們平常的new轉成了使用反射來擷取類的執行個體,相信任何人隻要會用java的反射機制,那麼自己寫一個IOC架構也不是不可能的。比如:

……

public Object getInstance(String className) throws Exception

{

    Object obj = Class.forName(className).newInstance();

    Method[] methods = obj.getClass().getMethods();

    for (Method method : methods) {

        if (method.getName().intern() == "setString") {

            method.invoke(obj, "hello world!");

        }

    }

}

上一篇: 團隊作業六
下一篇: 團隊作業五

繼續閱讀