天天看點

spring中IOC和DI

什麼是spring IOC:

   IOC—Inversion of Control,即“控制反轉”,不是什麼技術,而是一種設計思想。

  IOC是意味在java開發過程中将設計好的對象交給容器控制,而不是像傳統的方式由程式員在對象内部直接new;

    --誰控制誰,控制什麼?

       在傳統程式設計中是由程式員通過new的方式主動去建立依賴對象;

    而IOC中有專門的容器來控制對象的建立;

    是以是IOC容器控制了對象,主要控制了對外部資源的擷取;

--什麼是反轉,哪裡反轉了?

   正轉:傳統程式中由程式員直接去建立依賴對象就是正轉;

   反轉:由容器幫忙去建立或注入依賴對象就是反轉;由容器查找以及注入依賴對象(我們需要提供的隻是一個标記而已),對象隻是被動的接受依賴對象的而不是主動去建立的是以是反轉;

簡單荔枝:

    在家吃飯:想吃什麼菜要自己到菜市場買相應菜自己做了才能吃;

    在飯店吃飯:想吃什麼菜隻需要告訴飯店就可以吃了;

    這裡飯店就充當了IOC容器的角色,菜就是我們所依賴的對象;

    Spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統運作到适當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的建立、銷毀都由 spring來控制,也就是說控制對象生存周期的不再是引用它的對象,而是spring。對于某個具體的對象而言,以前是它控制其他對象,現在是所有對象都被spring控制,是以這叫控制反轉。

IOC能做些什麼:

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

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

IOC和DI:

   什麼是DI:

   DI—Dependency Injection,即“依賴注入”:元件之間依賴關系由容器在運作期決定,形象的說,即由容器動态的将某個依賴關系注入到元件之中。依賴注入的目的并非為軟體系統帶來更多功能,而是為了提升元件重用的頻率,并為系統搭建一個靈活、可擴充的平台。通過依賴注入機制,我們隻需要通過簡單的配置,而無需任何代碼就可指定目标需要的資源,完成自身的業務邏輯,而不需要關心具體的資源來自何處,由誰實作。

誰依賴誰:

程式依賴IOC容器;

為什麼需要依賴:

程式需要IOC容器來提供對象需要的外部資源;

誰注入誰:

IOC容器注入給程式某個對象,程式依賴的對象;

注入了什麼:

注入某個對象所需要的資源;

    IoC和DI由什麼關系呢?其實它們是同一個概念的不同角度描述,由于控制反轉概念比較含糊(可能隻是了解為容器控制對象這一個層面,很難讓人想到誰來維護對象關系),是以2004年大師級人物Martin Fowler又給出了一個新的名字:“依賴注入”,相對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就是通過反射來實作注入的。