1. 程式人生 > >IOC容器和依賴反轉模式

IOC容器和依賴反轉模式

測試 好的 del 基於 成功 簡潔 數據共享 world 了解

在這裏,我們先簡要地討論依賴反轉的相關概念。我們選取維基百科中關於體賴反轉的敘述,把這些文字作為我們理解依賴反轉這個概念的參考。這裏不會對這些原理進行學理.上的考究,只是希望提供-些有用的信息,以便給讀者一些自示。這個模式非常重要,它是IoC容器得到廣泛應用的基礎。
維基百科對“依賴反轉”相關概念的敘述

      平在2004年。Martin Fowler就提出了“哪些方面的控制被反轉了?”這個問題。他得出的結
論是依賴對象的獲得被反轉了。基於這個結論,他為控制反轉創造了一個更好的名字:依賴註
入。許多非凡的應用(CHelloWorldjava更加優美。更加復雜)都是由兩個或多個類通過彼此的
合作來實現業務邏輯的,這使得每個對象都需要與其合作的對象(也就是它所保賴的對象)的引
間。如果這個獲取過程要靠自身實現,那麽如你所見,這將導致代碼高度耦合並且難以測試。

以上的這段話概括了區賴反轉的要義,如果合作對象的引用成依賴關系的管理由具體對象東完成,會導致代碼的高發料合和可謝試性的降低,這對復雜的面向對象系統的設計是非常 不利的。在面向對象系統中。對象封裝T數據和對數據的處理,對象的依賴關系常常體現在對數備和方法的依賴上.這些位額關系可以通過把對家的依賴註入交給框架成IoC容器來完成, 這種從具體對象手中交出控制的做法是非常有價值的,它可以在解期代碼的同時提高代碼的可謝試性。在極限編程中對單元測試和重構等實踐的強調體現了在軟件開發過程中對質量的承 話,這是軟件項目成功的一個重要因素。
依賴控制反 轉的實現有很多種方式,在Spring中, IoC容器是實現這個模式的教體,它可以在對象生成或初始化時直接將數據註人到對象中,也可以通過將對象引用註人到對象數據城中的
方式來註人對方法調用的依賴。這種依賴註人是可以遞歸的,對象被逐易註人。就此而言,這種方案有一種完整而簡潔的美感,它把對象的依賴關系有序地建立起來,簡化了對象依賴關 系的管理,在很大程度上簡化了面向對象系統的復雜性。

關於如何反轉對依賴的控制,把控制權從具體業務對象手中轉交到平臺成者框架中,是降低面向對象系統設計復雜性和提高面向對象系統可測試性的一個有效的解決方案。它促進
TloC設計模式的發展,是loC容器要解決的核心向題。同時,也是產品化的IoC容器出
IoC原理的應用在不同的語言中有很多實現,比如SmallTalk、C++、 Java等。在同~語言的實現中也會有多個具體的產品,Spring是Java語 言實現中最著名的一個。同時,loC也是
Spring框架要解決的核心問題。 註意 應用控制反轉後,當對象被創建時,由一個調控系統內的所有對象的外界實體將其所依賴的對象的引用傳遞給它,即依賴被註入到對象中。所以,控制反轉是關於一個對象如何 獲取它所依賴的對象的引用,在這裏,反轉指的是責任的反轉。
我們可以認為上面提到的調控系統是應用平臺,或者更具體地說是IoC容器。通過使用IoC容器,對象依賴關系的管理被反轉了,轉到IoC容器中來了,對象之間的相互依賴關系由loC 容器進行管理,並由loc容器完成對象的註人。這樣就在很大程度上簡化了應用的開發,把應用從復雜的對象依賴關系管理中解放出來。簡單地說,因為很多對象依賴關系的建立和維護並 不需要和系統運行狀態有很強的關聯性,所以可以把在面向對象編程中需要執行的諸如新建對象、為對象引用賦值等操作交由容器統-完成。這樣一來,這些散落在不同代碼中的功能相同 的部分就集中成為容器的一部分,也就是成為面向對象系統的基礎設施的一部分。

如果對面向對象系統中的對象進行簡單分類,會發現除了一部分是數據對象外,其他很大一部分對象是用來處理數據的。這些對象並不常發生變化,是系統中基礎的部分。在很多情
況下,這些對象在系統中以單件的形式起作用就可以滿足應用的需求,而且它們也不常涉及數據和狀態共享的問題。如果涉及數據共享方面的問題,需要在這些單件的基礎上再做進一步 的處理。

同時,這些對象之間的相互依賴關系也是比較穩定的,一般不會隨著應用的運行狀態的改變而改變。這些特性使這些對象非常適合由IoC容器來管理,雖然它們存在於應用系統中,但
是應用系統並不承擔管理這些對象的責任,而是通過依賴反轉把責任交給了容器(或者說平臺)。了解了這些背景,Spring loC容器的原理也就不難理解了。在原理的具體實現上,

Spring有著自己的獨特思路、實現技巧和豐富的產品特性。關於這些原理的實現,下面會進行詳細的分析。


IOC容器和依賴反轉模式