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确實不是一個概念,就像去太空并一定是乘飛船(也可能是航天飛機)、去北京不一定是做高鐵(也可能是騎自行車)。這個比喻有點扯,将就将就吧。