天天看點

Spring之路(5)--IoC、DI傻傻分不清楚

1. 傻傻分不清楚

很多老鐵說起自己的Java水準,經常會提起,本人精通Spring,然後也熟知Spring的核心就是IoC和AOP。

然後一問啥是IoC、啥是DI,就懵了,扯不清楚到底啥是啥,還有的就認為IoC和DI就是一個事,其實還真是有點差别滴。

2. 控制反轉是啥

IoC,即Inversion of Control,翻譯成中文就是控制反轉,那是對啥玩意的控制反轉了呢,此處專指依賴項,也就是說對依賴項的控制發生了反轉。

具體說明下,正常情況是怎麼控制依賴項的呢,例如:

public class Driver {

//依賴項:姓名

private String name;

}

1

2

3

4

我們要在Driver對象中注入String對象,實際上是需要自己建立元件,然後通過構造函數或者set方法注入到Driver中。

那麼IoC控制反轉的情況下,對依賴項的控制是由容器來實作的,比如Spring容器就可以通過xml配置,将name的值注入到Driver對象中。

之前是程式員控制,之後是容器控制,實際上就是控制權發生了轉換,此處學者為之命名控制反轉,我個人感覺叫控制轉移也是OK的。

3. 依賴注入是啥

DI,全稱Dependency Injection,即依賴注入,上面說了控制反轉是容器控制依賴項,那麼如何将依賴項注入到元件中,有一些具體的方式,比較常用的是依賴查找和依賴注入。也就是說,依賴注入實際上是控制反轉的一種具體實作方式。

為了便于了解,此處稍微說明下依賴查找和依賴注入的差別:

依賴查找:程式員自己去查找依賴項

依賴注入:在容器中配置好依賴,容器自行裝配

Spring采用的是依賴注入的方式,也是主流的方式,肯定是好處多多,這個還得等Spring用的多了才能體會到。現在了解概念就是了。

4. 總結

說白了,如果限定死了就是Spring架構,那麼說IoC和DI是一回事,也差不多,畢竟Spring的IoC就是用DI方式實作的。

但是IoC和DI确實不是一個概念,就像去太空并一定是乘飛船(也可能是航天飛機)、去北京不一定是做高鐵(也可能是騎自行車)。這個比喻有點扯,将就将就吧。