學習過spring框架的人一定都會聽過spring的ioc(控制反轉) 、di(依賴注入)這兩個概念,但是有時候讓我們去講不一定可以講出來,或者說是不一定講的很好。今天我們就對此做一次總結
ioc—inversion of control,即「控制反轉」,不是什麼技術,而是一種設計思想。
ioc意味著將你設計好的物件交給容器控制,而不是傳統的在你的物件內部直接控制。
為了更加容易理解我們舉例進行詳細講解
如下圖所示,傳統意義上都是我們自己建立物件,然後去組合
有了ioc後我們只需直接從容器獲取即可
傳統應用程式都是由我們在類內部主動建立依賴物件,從而導致類與類之間高耦合,難於測試;有了ioc容器後,把建立和查詢依賴物件的控制權交給了容器,由容器進行注入組合物件,所以物件與物件之間是 鬆散耦合,這樣也方便測試,利於功能復用,更重要的是使得程式的整個體系結構變得非常靈活。
其實ioc對程式設計帶來的最大改變不是從**上,而是從思想上,發生了「主從換位」的變化。應用程式原本是老大,要獲取什麼資源都是主動出擊,但是在ioc/di思想中,應用程式就變成被動的了,被動的等待ioc容器來建立並注入它所需要的資源了。
ioc很好的體現了物件導向設計法則之一—— 好萊塢法則:「別找我們,我們找你」;即由ioc容器幫物件找相應的依賴物件並注入,而不是由物件主動去找
有點像通過婚介找女朋友,在我和女朋友之間引入了乙個第三者:婚姻介紹所。婚介管理了很多男男**的資料,我可以向婚介提出乙個列表,告訴它我想找個什麼樣的女朋友,比如長得像李嘉欣,身材像林熙雷,唱歌像周杰倫,速度像卡洛斯,技術像齊達內之類的,然後婚介就會按照我們的要求,提供乙個mm,我們只需要去和她談戀愛、結婚就行了。簡單明瞭,如果婚介給我們的人選不符合要求,我們就會丟擲異常。整個過程不再由我自己控制,而是有婚介這樣乙個類似容器的機構來控制。spring所倡導的開發方式就是如此,所有的類都會在spring容器中登記,告訴spring你是個什麼東西,你需要什麼東西,然後spring會在系統執行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的建立、銷毀都由 spring來控制,也就是說控制物件生存週期的不再是引用它的物件,而是spring。對於某個具體的物件而言,以前是它控制其他物件,現在是所有物件都被spring控制,所以這叫控制反轉。
1.3、ioc和di
ioc的乙個重點是在系統執行中,動態的向某個物件提供它所需要的其他物件。這一點是通過di來實現的。di則是通過反射來實現的
di—dependency injection,即「依賴注入」:元件之間依賴關係由容器在執行期決定,形象的說,即由容器動態的將某個依賴關係注入到元件之中。依賴注入的目的並非為軟體系統帶來更多功能,而是為了提公升元件重用的頻率,並為系統搭建乙個靈活、可擴充套件的平台。通過依賴注入機制,我們只需要通過簡單的配置,而無需任何**就可指定目標需要的資源,完成自身的業務邏輯,而不需要關心具體的資源來自何處,由誰實現。
理解di的關鍵是:「誰依賴誰,為什麼需要依賴,誰注入誰,注入了什麼」,那我們來深入分析一下:
●誰依賴於誰:當然是應用程式依賴於ioc容器;
●為什麼需要依賴:應用程式需要ioc容器來提供物件需要的外部資源;
●誰注入誰:很明顯是ioc容器注入應用程式某個物件,應用程式依賴的物件;
●注入了什麼:就是注入某個物件所需要的外部資源(包括物件、資源、常量資料)
ioc service provider 為被注入物件提供被依賴物件也有如下幾種方式:構造方法注入、stter方法注入、介面注入。
參考文章:
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...