這段時間也著實好好的看了下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 ObjectgetInstance(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!");
}
}
}
……
上面的一個方法我們就很簡單的使用了反射為指定的類的setString方法來設 置一個hello world!字符串。其實可以看到IOC真的很簡單,當然了IOC簡單並不 表示spring的IOC就簡單,spring的IOC的功能強大就在於有一系列非常強大的配 置文件維護類,它們可以維護spring配置文件中的各個類的關系,這才是spring 的IOC真正強大的地方。在spring的Bean定義文件中,不僅可以為定義Bean設置 屬性,還支持Bean之間的繼承、Bean的抽象和不同的獲取方式等等功能。
下次俺再把spring的Bean配置的相關心得和大家一起分享下,如果說的不好 ,大家可以提意見哦,可千萬不要仍臭雞蛋,嘿嘿~~~~
原文:http://j2ee.blog.sohu.com/63333114.html