spring中的Ioc技術是怎樣實現解耦的
我們還是從USB的例子說起,使用USB外部裝置比使用內建硬碟,到底帶來什麼好處?
第一、USB裝置作為電腦主機的外部裝置,在插入主機之前,與電腦主機沒有任何的關係,只有被我們連線在一起之後,兩者才發生聯絡,具有相關性。所以,無論兩者中的任何一方出現什麼的問題,都不會影響另一方的執行。這種特性體現在軟體工程中,就是可維護性比較好,非常便於進行單元測試,便於除錯程式和診斷故障。程式碼中的每一個Class都可以單獨測試,彼此之間互不影響,只要保證自身的功能無誤即可,這就是元件之間低耦合或者無耦合帶來的好處。
第二、USB裝置和電腦主機的之間無關性,還帶來了另外一個好處,生產USB裝置的廠商和生產電腦主機的廠商完全可以是互不相干的人,各幹各事,他們之間唯一需要遵守的就是USB介面標準。這種特性體現在軟體開發過程中,好處可是太大了。每個開發團隊的成員都只需要關心實現自身的業務邏輯,完全不用去關心其它的人工作進展,因為你的任務跟別人沒有任何關係,你的任務可以單獨測試,你的任務也不用依賴於別人的元件,再也不用扯不清責任了。所以,在一個大中型專案中,團隊成員分工明確、責任明晰,很容易將一個大的任務劃分為細小的任務,開發效率和產品質量必將得到大幅度的提高。
第三、同一個USB外部裝置可以插接到任何支援USB的裝置,可以插接到電腦主機,也可以插接到DV機,USB外部裝置可以被反覆利用。在軟體工程中,這種特性就是可複用性好,我們可以把具有普遍性的常用元件獨立出來,反覆利用到專案中的其它部分,或者是其它專案,當然這也是面向物件的基本特徵。顯然,IOC不僅更好地貫徹了這個原則,提高了模組的可複用性。符合介面標準的實現,都可以插接到支援此標準的模組中。
第四、同USB外部裝置一樣,模組具有熱插拔特性。IOC生成物件的方式轉為外接方式,也就是把物件生成放在配置檔案裡進行定義,這樣,當我們更換一個實現子類將會變得很簡單,只要修改配置檔案就可以了,完全具有熱插撥的特性。
以上幾點好處,難道還不足以打動我們,讓我們在專案開發過程中使用IOC框架嗎?
5. IOC容器的技術剖析
IOC中最基本的技術就是“反射(Reflection)”程式設計,目前.Net C#、Java和PHP5等語言均支援,其中PHP5的技術書籍中,有時候也被翻譯成“對映”。有關反射的概念和用法,大家應該都很清楚,通俗來講就是根據給出的類名(字串方式)來動態地生成物件。這種程式設計方式可以讓物件在生成時才決定到底是哪一種物件。反射的應用是很廣泛的,很多的成熟的框架,比如象Java中的Hibernate、Spring框架,.Net中 NHibernate、Spring.Net框架都是把“反射”做為最基本的技術手段。
反射技術其實很早就出現了,但一直被忽略,沒有被進一步的利用。當時的反射程式設計方式相對於正常的物件生成方式要慢至少得10倍。現在的反射技術經過改良優化,已經非常成熟,反射方式生成物件和通常物件生成方式,速度已經相差不大了,大約為1-2倍的差距。
我們可以把IOC容器的工作模式看做是工廠模式的昇華,可以把IOC容器看作是一個工廠,這個工廠裡要生產的物件都在配置檔案中給出定義,然後利用程式語言的的反射程式設計,根據配置檔案中給出的類名生成相應的物件。從實現來看,IOC是把以前在工廠方法裡寫死的物件生成程式碼,改變為由配置檔案來定義,也就是把工廠和物件生成這兩者獨立分隔開來,目的就是提高靈活性和可維護性。
6. IOC容器的一些產品
Sun ONE技術體系下的IOC容器有:輕量級的有Spring、Guice、Pico Container、Avalon、HiveMind;重量級的有EJB;不輕不重的有JBoss,Jdon等等。Spring框架作為Java開發中SSH(Struts、Spring、Hibernate)三劍客之一,大中小專案中都有使用,非常成熟,應用廣泛,EJB在關鍵性的工業級專案中也被使用,比如某些電信業務。
.Net技術體系下的IOC容器有:Spring.Net、Castle等等。Spring.Net是從Java的Spring移植過來的IOC容器,Castle的IOC容器就是Windsor部分。它們均是輕量級的框架,比較成熟,其中Spring.Net已經被逐漸應用於各種專案中。
7. 使用IOC框架應該注意什麼
使用IOC框架產品能夠給我們的開發過程帶來很大的好處,但是也要充分認識引入IOC框架的缺點,做到心中有數,杜絕濫用框架。
第一、軟體系統中由於引入了第三方IOC容器,生成物件的步驟變得有些複雜,本來是兩者之間的事情,又憑空多出一道手續,所以,我們在剛開始使用IOC框架的時候,會感覺系統變得不太直觀。所以,引入了一個全新的框架,就會增加團隊成員學習和認識的培訓成本,並且在以後的執行維護中,還得讓新加入者具備同樣的知識體系。
第二、由於IOC容器生成物件是通過反射方式,在執行效率上有一定的損耗。如果你要追求執行效率的話,就必須對此進行權衡。
第三、具體到IOC框架產品(比如:Spring)來講,需要進行大量的配製工作,比較繁瑣,對於一些小的專案而言,客觀上也可能加大一些工作成本。
第四、IOC框架產品本身的成熟度需要進行評估,如果引入一個不成熟的IOC框架產品,那麼會影響到整個專案,所以這也是一個隱性的風險。
我們大體可以得出這樣的結論:一些工作量不大的專案或者產品,不太適合使用IOC框架產品。另外,如果團隊成員的知識能力欠缺,對於IOC框架產品缺乏深入的理解,也不要貿然引入。最後,特別強調執行效率的專案或者產品,也不太適合引入IOC框架產品,象WEB2.0網站就是這種情況。