1. 程式人生 > >深入瞭解Spring是如何做到解耦的

深入瞭解Spring是如何做到解耦的

我們都知道Spring的主要目的是降低耦合,而Spring是如何做到降低耦合的呢?

Spring主要有兩個功能,IOC(inversion of control)與AOP(Aspect-Oriented Programming)

IOC(控制反轉):IOC的控制反轉名字是怎麼來的呢,這就要說到他的作用了。 

上圖代表我們程式裡的四個物件A,B,C,D,可以看到他們互相之間有著緊密的聯絡,如果其中的某個齒輪停止轉動,則會導致所有的齒輪都跟隨停止。

而我們寫程式最求的目標是高內聚,低耦合,明顯上圖中程式耦合度沒有滿足我們的目標。

1996年,Michael Mattson在一篇有關探討面向物件框架的文章中,首先提出了IOC 這個概念。對於面向物件設計及程式設計的基本思想,前面我們已經講了很多了,不再贅述,簡單來說就是把複雜系統分解成相互合作的物件,這些物件類通過封裝以後,內部實現對外部是透明的,從而降低了解決問題的複雜度,而且可以靈活地被重用和擴充套件。IOC理論提出的觀點大體是這樣的:藉助於“第三方”實現具有依賴關係的物件之間的解耦,如下圖: 



 

可以看到,我們加入了第三方容器“IOC”之後,我們的4個物件之前並沒有了任何的聯絡,一切都被第三方容器控制著。如果是以前物件A如果想要呼叫物件B中的某個方法,就需要現在物件A中new一個物件B,建立一個物件B的例項之後再呼叫,這個過程的主動權完全由物件A來控制。而加入了IOC容器之後,物件A如果想要呼叫物件B,就需要通知IOC我需要呼叫物件B,這時IOC容器找到物件B的例項注入到物件A中,這個過程對於物件A來說完全是被動的,控制權都交到了IOC手裡,這就是IOC控制反轉的由來,由主動轉為被動。

IOC的別名:依賴注入(DI)
2004年,Martin Fowler探討了同一個問題,既然IOC是控制反轉,那麼到底是“哪些方面的控制被反轉了呢?”,經過詳細地分析和論證後,他得出了答案:“獲得依賴物件的過程被反轉了”。控制被反轉之後,獲得依賴物件的過程由自身管理變為了由IOC容器主動注入。於是,他給“控制反轉”取了一個更合適的名字叫做“依賴注入(Dependency Injection)”。他的這個答案,實際上給出了實現IOC的方法:注入。所謂依賴注入,就是由IOC容器在執行期間,動態地將某種依賴關係注入到物件之中。
所以,依賴注入(DI)和控制反轉(IOC)是從不同的角度的描述的同一件事情,就是指通過引入IOC容器,利用依賴關係注入的方式,實現物件之間的解耦。