談談你對Spring IOC 和 DI的理解,以及它們有什么區別?
IOC是什么?
IOC--Inversion of Control,即控制反轉,不是什么技術,而是一種設計思想.IOC意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制.
IOC的優勢是什么?
IOC是一個重要的面向對象編程的法則,它能指導我們如何設計出松耦合,更優良的程序,傳統的應用程序都是由我們在類的內部主動創建依賴對象,從而導致類與類之間的高耦合,有了IOC容器之后,把創建和查找依賴對象的控制權交給了IOC容器,由容器進行注入組合對象,所以對象和對象之間是松耦合的.
DI是什么?
DI--Dependency Injection,即依賴注入,組件之間依賴關系由容器在運行期決定,即由容器動態的將某個依賴關系注入到組件當中,依賴注入的目的並非為軟件系統帶來更多的功能,而是為了提升組件重復使用的頻率,並為系統搭建一個靈活可擴展的平台,通過依賴注入我們只需要使用簡單的配置,而不需要任何代碼就可以指定目標需要的資源,完成業務邏輯,而不需要關心具體的資源來自何處,由誰實現的.
IOC--控制反轉的通俗解釋:
所謂的IOC,對於spring框架來說,就是由spring來負責控制對象的生命周期和對象間的關系,所有的類都會在spring容器中登記,告訴spring你是個什么東西,你需要什么東西,然后spring會在系統運行到適當的時候,把你要的東西給你,同時也把你交給其他需要你的東西,所有的類的創建,銷毀都是由spring來控制,也就是說控制對象的生命周期不再是引用它的對象,而是spring,對於某個具體的對象而言,以前是它控制其他對象,而現在所有的對象都由spring控制,所以這就叫控制反轉.
DI--依賴注入的通俗理解:
如果程序中A需要依賴B才能正常進行,而這時候B不是自己創建的而是由spring容器注入給A的,spring會在適當的時候創建B,然后像打針一樣注入給A,所以依賴注入的名字就是這么來的.那么DI是如何實現的呢?Java 1.3之后一個重要的特征就是反射(reflection),它允許程序在運行的時候動態的生成對象,執行對象的方法,改變對象的屬性,spring就是通過反射來注入的.
誰依賴了誰?當然是應用程序依賴於IOC容器;
為什么需要依賴?應用程序需要IOC容器來提供對象需要的外部資源;
誰注入誰?IOC容器注入應用程序某個對象,應用程序依賴的對象;
注入了什么?注入某個對象所需要的外部資源(包括對象,資源,常亮數據);
IOC和DI有什么關系?
其實它們是同一個概念的不同角度的描述.