IoC控制反轉(IoC,Inversion of Control)
是一個概念,是一種思想。控制反轉就是對對象控制權的轉移,從程序代碼本身反轉到了外部容器。把對象的創建、初始化、銷毀等工作交給spring容器來做。由spring容器控制對象的生命周期。即是將new 的過程交給spring容器去處理
(例如:早上去早餐店買了一個包子,包子是早餐店做的,你通過錢買下了包子,包子的決定權就從早餐店轉移到了你的手上)
DI依賴注入:
依賴注入DI是指程序運行過程中,若需要調用另一個對象協助時,無須在代碼中創建被調用者,而是依賴於外部容器,由外部容器創建后傳遞給程序。依賴注入是目前最優秀的解耦方式。依賴注入讓Spring的Bean之間以配置文件的方式組織在一起,而不是以硬編碼的方式耦合在一起的。
要理解這兩個概念,首先要搞清楚以下幾個問題:
參與者都有誰?
依賴:誰依賴於誰?為什么需要依賴?
注入:誰注入於誰?到底注入什么?
控制反轉:誰控制誰?控制什么?為何叫反轉(有反轉就應該有正轉了)?
依賴注入和控制反轉是同一概念嗎?
下面就來簡要的回答一下上述問題,把這些問題搞明白了,IoC/DI也就明白了。
(1)參與者都有誰:
一般有三方參與者,一個是某個對象;一個是IoC/DI的容器;另一個是某個對象的外部資源。
又要名詞解釋一下,某個對象指的就是任意的、普通的Java對象; IoC/DI的容器簡單點說就是指用來實現IoC/DI功能的一個框架程序;對象的外部資源指的就是對象需要的,但是是從對象外部獲取的,都統稱資源,比如:對象需要的其它對象、或者是對象需要的文件 資源等等。
(2)誰依賴於誰:
當然是某個對象依賴於IoC/DI的容器
(3)為什么需要依賴:
對象需要IoC/DI的容器來提供對象需要的外部資源
(4)誰注入於誰:
很明顯是IoC/DI的容器 注入 某個對象
(5)到底注入什么:
就是注入某個對象所需要的外部資源
(6)誰控制誰:
當然是IoC/DI的容器來控制對象了
(7)控制什么:
主要是控制對象實例的創建
(8)為何叫反轉:
反轉是相對於正向而言的,那么什么算是正向的呢?考慮一下常規情況下的應用程序,如果要在A里面使用C,你會怎么做呢?當然是直接去創建C的對象,也就是說,是在A類中主動去獲取所需要的外部資源C,這種情況被稱為正向的。那么什么是反向呢?就是A類不再主動去獲取C,而是被動等待,等待IoC/DI的容器獲取一個C的實例,然后反向的注入到A類中。