天天看點

2、IOC:控制反轉 DI:依賴注入

Ioc—Inversion of Control,即“控制反轉”,不是什麼技術,而是一種設計思想。在Java開發中,IOC意味着将你設計好的對象交給容器控制,而不是傳統的在你的對象内部直接控制。

如何了解好IOC呢?了解好IOC的關鍵是要明确“誰控制誰,控制什麼,為何是反轉(有反轉就應該有正轉了),哪些方面反轉了”,那我們來深入分析一下:

●誰控制誰,控制什麼:傳統JavaSE程式設計,我們直接通過new進行建立對象,是程式主動去建立依賴對象;而IOC是有專門一個容器來建立這些對象,即由IOC容器來控制對象的建立;誰控制誰?當然是IOC 容器控制了對象;控制什麼?那就vkdnxicndks奮鬥vkihcxivcnekvdnidhfkrdfvhihnesekgv很大部分街道辦vjbjjcjdbjvbhdbvj百度搜尋bc将被當機活動送vcjsaxcbjadfbuejdgfjrdujfeujeiuedjudchbxhvcbjjdbvjdbvjdbvdjdbcjdbvjdbj九局下半vcjdvtftfe是主要控制了外部資源擷取(不隻是對象包括比如檔案等)。

●為何是反轉,哪些方面反轉了:有反轉就有正轉,傳統應用程式是由我們自己在對象中主動控制去直接擷取依賴對象,也就是正轉;而反轉則是由容器來幫忙建立及注入依賴對象;為何是反轉?因為由容器幫我們查找及注入依賴對象,對象隻是被動的接受依賴對象,是以是反轉;哪些方面反轉了?依賴對象的擷取被反轉了。

用圖例說明一下,傳統程式設計 毛線打算如下圖,都是主動去建立相關對象然後再組合起來:

2、IOC:控制反轉 DI:依賴注入
2、IOC:控制反轉 DI:依賴注入

圖2-2有IOC/DI容器後程式結構示意圖

IOC能做什麼

IOC不是一種技術,隻是一種思想,一個重要的面向對象程式設計的法則,它能指導我們如何設計出松耦合、更優良的程式。傳統應用程式都是由我們在類内部主動建立依賴對象,進而導緻類與類之間高耦合,難于測試;有了IOC容器後,把建立和查找依賴對象的控制權交給了容器,由容器進行注入組合對象,是以對象與對象之間是松散耦合,這樣也友善測試,利于功能複用,更重要的是使得程式的整個體系結構變得非常靈活。

其實IOC對程式設計帶來的最大改變不是從代碼上,而是從思想上,發生了“主從換位”的變化。應用程式原本是老大,要擷取什麼資源都是主動出擊,但是在IOC/DI思想中,應用程式就變成被動的了,被動的等待IOC容器來建立并注入它所需要的資源了。

IOC很好的展現了面向對象設計法則之一——好萊塢法則:“别找我們,我們找你”;即由IOC容器幫對象找相應的依賴對象并注入,而不是由對象主動去找。

IoC的一個重點是在系統運作中,動态的向某個對象提供它所需要的其他對象。這一點是通過DI(Dependency Injection,依賴注入)來實作的。比如對象A需要操作資料庫,以前我們總是要在A中自己編寫代碼來獲得一個Connection對象,有了 spring我們就隻需要告訴spring,A中需要一個Connection,至于這個Connection怎麼構造,何時構造,A不需要知道。在系統運作時,spring會在适當的時候制造一個Connection,然後像打針一樣,注射到A當中,這樣就完成了對各個對象之間關系的控制。A需要依賴 Connection才能正常運作,而這個Connection是由spring注入到A中的,依賴注入的名字就這麼來的。那麼DI是如何實作的呢? Java 1.3之後一個重要特征是反射(reflection),它允許程式在運作的時候動态的生成對象、執行對象的方法、改變對象的屬性,spring就是通過反射來實作注入的。

IOC和DI

IOC與DI:

IOC(Inversion Of Control)—控制反轉。把對象建立交給Spring配置。避免對象之間的耦合、避免應用程式依賴于容器的功能。

DI(Dependency Injection)—依賴注入。向對象的屬性注入值。不必自己在程式代碼中維護對象的依賴關系

依賴注入不能單獨存在,需要在IOC的基礎之上來完成依賴注入。

控制反轉IoC(Inversion of Control)是說建立對象的控制權進行轉移,以前建立對象的主動權和建立時機是由自己把控的,而現在這種權力轉移到第三方,比如轉移交給了IoC容器,它就是一個專門用來建立對象的工廠,你要什麼對象,它就給你什麼對象,有了IoC容器,依賴關系就變了,原先的依賴關系就沒了,它們都依賴IoC容器了,通過IoC容器來建立它們之間的關系。

DI(依賴注入)其實是IOC的另外一種說法,DI是由大師級人物Martin Fowler 在2004年初首次提出。他總結:控制的什麼被反轉了?就是:獲得依賴對象的方式反轉了。

下一節:3、bean管理:XML方式,4、自動裝配bean

繼續閱讀