學習spring的童鞋都知道,spring中有兩個非常重要的點,Ioc(控制反轉)與DI(依賴注入),對於初級玩家來說,這兩個概念可能有點模棱兩可的感覺,今天就談下自己的一點理解,不足請多多指教!!! 本文人力資源局的例子只為方便理解,無任何指向意義
一、Ioc是什么?
控制反轉(Inversion of Control,縮寫為IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。當然,這是百度說的,看了還是不懂,so,復雜的東西簡單說
控制反轉三個問題:1、誰控制誰;
2、控制了什么;
3、怎么就反轉了;
第一個問題:誰控制誰,Ioc其實可以把它當做一個容器,一個存儲對象的容器,我們開發中的對象都可以交給spring Ioc容器做一個統一的規范管理,就好像是我們每個人都有自己的簡歷,全部交給人力資源局來管理,Ioc容器就充當一個人力資源局的角色;
第二個問題:控制了什么,既然我們的開發之中的對象已經全部交由Ioc容器來管理了,那我們在獲取對象的時候就得由Ioc容器來給我們提供,那么然Ioc容器也就控制了我們實例對象的獲取權,就好像我們要去取得一個人的檔案,就得由人力資源局提供,人力資源局控制了我們檔案的提取;
第三個問題:怎么就反轉了,其實說白了就是一個控制權的反轉,好比我們需要一個其他人的檔案,我們直接去找這個人家要過來,這個事情是我們來做,控制權就在我們手里(程序過程就是classA需要一個classB的實例,就在A類中直接new 一個B的實例來使用),但是現在我們不直接向這個人所要檔案了,我們去向資源局去索要這個人的檔案,由人力局把檔案給我們(程序過程就是classA需要classB的一個實例,然后告訴Ioc容器,我需要B的實例,你給我一個,然后容器把B的實例給classA),現在,弄檔案這個事情是資源局在做而不是我們了,這個弄檔案的事情的控制權到了資源局手里而非我們自己去弄,Ioc的職責就像是資源局,我們在使用spring框架開發時,就把我們的對象交由spring Ioc容器來管理,我們對實例對象的控制權利發生了一個反轉;
二、Ioc容器能干什么,為什么要把對象的控制權交給容器來管理?
Ioc是一種設計思想,幫助我們實現程序之間的解耦,設計出耦合性更低更優良的的程序,傳統的開發模式在程序類的內部主動的依賴對象(new Object)來實現注入,從而使的類之間高度耦合,有了Ioc容器之后,我們可以把對象的控制權交給容器,讓容器為我們創建管理對象,這樣,對象之間耦合度變低,程序的架構體系也會更加的靈活;
三、Ioc與DI
看過很多的博客都把Ioc跟DI分開來說,我個人感覺他們的緊密程度非常之大,像是一條工作鏈必不可少的部分,工作模式又是相輔相成;
什么是DI:依賴注入,在容器運行的時候,掃描所有的依賴關系,並為之動態的注入對應的依賴關系,比如,我們需要某人的檔案了,就給人力資源局發一個通知,告訴他我需要領取xxx的檔案,然后資源局就把檔案給你送過來,我們領取檔案的過程就是DI(依賴注入)
DI的幾個問題:1、誰依賴誰
2、誰注入了誰
3、注入了什么
第一個問題:1、誰依賴誰,從我們領取檔案的流程來看就知道我們依賴於人力資源局,也就是說程序依賴於Ioc容器
第二個問題:2、誰注入了誰,人力資源局把檔案給我們,也就是說Ioc容器把對象注入了程序之中(這個過程就是依賴注入)
第三個問題:3、注入了什么,我們向人力資源局要檔案然后給了我們,就是容器把我們依賴的對象注入了程序
Ioc與DI的關系:他兩的關系就像是同一個問題的不同角度的描述,總是那么的緊密相連,理解過上邊的自然心里就清晰了
四、總結
看到這里,其實Ioc容器就是為我們提供一個公共的管理平台,管理我們對象之間的依賴關系,我們需要什么就向容器要,容器之中如果要就會給我們,我們拿過來直接用,而不用去考慮對象什么時候創建,什么時候銷毀,只管用就行了,是不是方便了很多
以上就是我對Ioc跟DI的一些理解,不足之處多多指教!