理解Spring中的依賴注入和控制反轉

2022-10-06 20:48:20 字數 2680 閱讀 2944

學習過spring框架的人一定都會聽過spring的ioc(控制反轉) 、di(依賴注入)這兩個概念,對於初學spring的人來說,總覺得ioc 、di這兩個概念是模糊不清的,是很難理解的,今天和大家分享網上的一些技術大牛們對spring框架的ioc的理解以及談談我對spring ioc的理解。

ioc是什麼

ioc—inversionofcontrol,即「控制反轉」,不是什麼技術,而是一種設計思想。在j**a開發中,ioc意味著將你設計好的物件交給容器控制,而不是傳統的在你的物件內部直接控制。

ioc,這是spring的核心,貫穿始終。所謂ioc,對於spring框架來說,就是由spring來負責控制物件的生命週期和物件間的關係。這程式設計客棧是什麼意思呢,舉個簡單的例子,我們是如何找女朋友的?常見的情況是,我們到處去看**有長得漂亮身材又好的mm,然qtsthnzbjh後打聽她們的興趣愛好、qq號、**號、ip號、iq號………,想辦法認識她們,投其所好送其所要,然後嘿嘿……這個過程是復www.cppcns.com雜深奧的,我們必須自己設計和面對每個環節。傳統的程式開發也是如此,在乙個物件中,如果要使用另外的物件,就必須得到它(自己new乙個,或者從jndi中查詢乙個),使用完之後還要將物件銷毀(比如connection等),物件始終會和其他的介面或類藕合起來。

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

●誰控制誰,控制什麼:傳統j**ase程式設計,我們直接在物件內部通過new進行建立物件,是程式主動去建立依賴物件;而ioc是有專門乙個容器來建立這些物件,即由ioc容器來控制物件的建立;誰控制誰?當然是ioc容器控制了物件;控制什麼?那就是主要控制了外部資源獲取(不只是物件包括比如檔案等)。

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

用圖例說明一下,傳統程式設計如圖1-1,都是主動去建立相關物件然後再組合起來:

圖1-1 傳統應用程式示意圖

當有了ioc/di的容器後,在客戶端類中不再主動去建立這些物件了,如圖1-2所示:

圖1-2有ioc/di容器後程式結構示意圖

1.1.2ioc能做什麼

ioc不是一種技術,只是一種思想,乙個重要的物件導向程式設計的法則,它能指導我們如何設計出松耦合、更優良的程式。傳統應用程式都是由我們在類內部主動建立依賴物件,從而導致類與類之間高耦合,難於測試;有了ioc容器後,把建立和查詢依賴物件的控制權交給了容器,由容器進行注入組合物件,所以物件與物件之間是鬆散耦合,這樣也方便測試,利於功能復用,更重要的是使得程式的整個體系結構變得非常靈活。

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

ioc很好的體現了物件導向設計法則之一——好萊塢法則:「別找我們,我們找你」;即由ioc容器幫物件找相應的依賴物件並注入,而不是由物件主動去找。

1.1.3ioc和di

di—dependencyinjection,即「依賴注入」:是元件之間依賴關係由容器在執行期決定,形象的說,即由容器動態的將某個依賴關係注入到元件之中。依賴注入的目的並非為軟體系統帶來更多功能,而是為了提公升元件重用的頻率,並為系統搭建乙個靈活、可擴充套件的平台。通過依賴注入機制,我們只需要通過簡單的配置,而無需任何**就可指定目標需要的資源,完成自身的業務邏輯,而不需要關心具體的資源來自何處,由誰實現。

ioc的乙個重點是在系統執行中,動態的向某個物件提供它所需要的其他物件。這一點是通過di(dependency injection,依賴注入)來實現的。比如物件a需要運算元據庫,以前我們總是要在a中自己編寫**來獲得乙個connection物件,有了 spring我們就只需要告訴spring,a中需要乙個connection,至於這個connection怎麼構造,何時構造,a不需要知道。在系統執行時,spring會在適當的時候製造乙個connection,然後像打針一樣,注射到a當中,這樣就完成了對各個物件之間關係的控制。a需要依賴 connection才能正常執行,而這個connection是由spring注入到a中的,依賴注入的名字就這麼來的。那麼di是如何實現的呢? j**a 1.3之後乙個重要特徵是反射(reflection),它允許程式在執行的時候動態的生成物件、執行物件的方法、改變物件的屬性,spring就是通過反射來實現注入的。

理解di的關鍵是:「誰依賴誰,為什麼需要依賴,誰注入誰,注入了什麼」,那我們來深入分析一下:

●誰依賴於誰:當然是應用程式依賴於ioc容器;

●為什麼需要依賴:應用程式需要ioc容器來提供物件需要的外部資源;

●誰注入誰:很明顯是ioc容器注入應用程式某個物件,應用程式依賴的物件;

●注入了什麼:就是注入某個物件所需要的外部資源(包括物件、資源、常量資料)。

ioc和di由什麼關係呢?其實它們是同乙個概念的不同角度描述,由於控制反轉概念比較含糊(可能只是理解為容器控制物件這乙個層面,很難讓人想到誰來維護物件關係),所以2023年大師級人物martinfowler又給出了乙個新的名字:「依賴注入」,相對ioc而言,「依賴注入」明確描述了「被注入物件依賴ioc容器配置依賴物件」。

總結其實對於spring ioc這個概念,每個人都有自己的理解,並沒有標準答案,大致方向沒錯即可。

spring 依賴注入 Spring依賴注入

依賴注入 dependency injection,簡稱di 與控制反轉 ioc 的含義相同控制反 在使用spring框架之後,物件的例項不再由呼叫者來建立,而是由spring容器來建立,spring容器會負責控制程式之間的關係,而不是由呼叫者的程式 直接控制,這樣控制權由應用程式轉移到了sprin...

Spring中的依賴注入

spring中的依賴注入 依賴注入 dependency injection ioc的作用 降低程式間的依賴 依賴關係的管理 以後都交給spring來維護 在當前類需要用到其他類的物件,由spring為我們提供,我們只需要在配置檔案中說明 依賴關係的維護 就稱之為依賴注入 依賴注入 能注入的資料 有...

深入理解Spring框架中的 依賴注入

spring framework spring框架的核心概念就是 依賴注入 什麼是依賴注入?其實理解起來很簡單,依賴注入其實就是框架用於連線各個應用程式的一項技術。框架負責將你的應用程式中的各種相互依賴進行連線起來,並從應用程式 中完全解決掉連線邏輯和物件建立。舉乙個描述收銀機的例子 1.建立乙個介...