IoC(inversion of Control),控制反轉。就好像敏捷開發和SCRUM同樣,不是什麼技術,而是一種方法論,一種工程化的思想。使用IoC的思想意味着你將設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。html
爲何要控制反轉呢,誰在控制誰呢,反轉了什麼東西呢?這篇筆記聊的就是這些東西java
依賴(在A類裏面建立了B類的實例,這樣A依賴於B)git
在Github上面看到了一段頗有意思的僞代碼,我感受很能解釋IoC的關係,因而就摘抄到這裏面來github
在生活中,和一個女孩子認識有三種方法spring
兩小無猜數據庫
public class Girl{ void Kiss(){ Boy RightPerson = new Boy(); } }
這個RightPerson最大的缺點就是沒辦法更換(...),在Boy的整個生命週期裏面他都會存在,若是Girl想換一個boy kiss呢,就不是很好了(...)編程
相親平臺框架
public class Girl{ void Kiss(){ Boy Boy = BoyFactory.createBoy(); } }
這個Boy是否是RightPerson就不知道了,可是不滿意就換。可是咱們如今有了一個Boy Factory,這很煩,有外人/平臺介入了平常生活,它以單例模式或者是存在於全局。測試
值得信賴的人安排,只須要守株待兔ui
public class Girl{ void kiss(Boy boy){ boy.kiss(); } }
你傳什麼給我,我就和什麼Kiss(表達有點不大合適,可是也想不出什麼好詞了),至少這種方式Girl和Boy不用忙活了。
這就是IoC的基本思想,將對象的建立和提取到外部,由外部容器提供所須要的組件。
說實話,」高內聚,低耦合「這句話我都聽到吐了。每一個上過軟件工程導論課的同窗都能跟你侃侃而談五分鐘。那接着往下問」什麼是內聚,什麼是耦合「」爲何要倡導鬆耦合的設計,這跟面向對象設計法則又有什麼關係呢?「
有了IoC容器後,把建立和查找依賴對象的控制權交給了容器,由容器進行注入組合對象,因此對象與對象之間的耦合是鬆散的,這樣也方便測試,利於功能複用,更重要的是使得程序的整個體系結構變得很是靈活。
IoC至關因而將應用程序賦予給了一箇中心,IoC容器。
都提到IoC了,怎麼能少得了DI(Dependency Injection ),注入依賴或者依賴注入?anyway,隨便你。組件之間的依賴關係由容器在運行過程當中規定。具象化一點,各個組件的依賴關係是由容器來注入的。開發者依賴這個機制,只須要經過配置指定資源,完成業務邏輯便可,不用關心具體的資源來自何方,由誰實現(依然是面向對象的思想)
##### 那麼,你說的這個DI和IoC,他們有區別嗎?
有區別,可是其實DI和IoC說的是一個東西,由於IoC這個東西說的模模糊糊,Martin Fowler(XP的提出者之一,敏捷方法的創始人)在2004提出了DI的概念,「依賴注入」明確描述了「被注入對象依賴IoC容器配置依賴對象」。
Martin Fowler 的原文是這樣的,在inversion of Control這一節裏面,他提到
As a result I think we need a more specific name for this pattern. Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection.
IoC是咱們想要作的事情,每一個框架都說本身IoC,DI是咱們採起的手段
我摘了一段知乎的回答,問題的連接貼在下面,有些回答舉了一些具體的例子,頗有利於理解
ioc的思想最核心的地方在於,資源不禁使用資源的雙方管理,而由不使用資源的第三方管理,這能夠帶來不少好處。
第一,資源集中管理,實現資源的可配置和易管理。
第二,下降了使用資源雙方的依賴程度,也就是咱們說的耦合度。
咱們都知道Spring的AOP是這個框架的重要組成部分 ,那AOP,面向切面編程又是在作什麼呢? 在面向對象的思想裏面(Object-Oriented Programing)有三大法寶,」封裝,繼承,多態「,用這三大法寶創建了對象的層次,可是它是一個縱向的結構,有比較明確的上下級關係,可是在平行的層次中發揮不出太大的做用。
因此咱們又須要一種橫向的結構來定義這些平行的關係,以日誌記錄爲例,記錄日誌通常要在操做完畢以後,用OOP的思想,那我就要去項目的每一個操做數據庫的方法的裏面去加上保存日誌,這會致使代碼重複,模塊的重用會所以受到影響。
若是使用AOP,只須要自定義一個方法,在spring配置文件中將該方法配置好,當每次調用完原先的save方法時,都會去執行你寫的保存日誌方法。
它將程序中的交叉業務邏輯(日誌,事務等),封裝成一個切面,而後注入到目標對象(具體業務邏輯)中去。
《Spring實戰》
Spring IoC有什麼好處呢 https://www.zhihu.com/question/23277575/answer/134413451 (這裏面有一些回答頗有參考價值,仔細看看發現本身之前的理解仍是有問題)
Inversion of Control Containers and the Dependency Injection pattern https://martinfowler.com/articles/injection.html
原文出處:https://www.cnblogs.com/QuixoteY/p/11170263.html