標籤:

IOC和DI有什麼區別?

spring框架的核心是IOC(控制反轉)和AOP(面向切面),我想了解一下IOC和DI(依賴注入)這兩個概念有什麼區別?


IOC是個更寬泛的概念,DI是更具體的。引用鄭燁的一篇博客,我眼中的Spring

Dependency Injection

原來,它叫IoC。

Martin Flower發話了,是個框架都有IoC,這不足以新生容器反轉的「如何定位插件的具體實現」,於是,它有了個新名字,Dependency Injection。

其實,它就是一種將調用者與被調用者分離的思想,Uncle Bob管它叫DIP(Dependency Inversion Principle),並把它歸入OO設計原則。

同Spring相比,它更早進入我的大腦。一切都是那麼朦朧,直至Spring出現。

慢慢的,我知道了它還分為Interface Injection(type 1),Setter Injection(type 2),Constructor Injection(type 3)。Martin Flower那篇為它更名的大作讓我心目關於它的一切趨於完整。

在Spring中,它是一切的基礎。Spring的種種優勢隨之而來。

於我而言,它為我帶來更多的是思維方式的轉變,恐怕以後我再也無法寫出那種一大塊的全功能程序了。


《EXPERT ONE ON ONE J2EE DEVELOPMENT WITHOUT EJB》第6章:

IoC主要的實現方式有兩種:依賴查找,依賴注入。(128頁)

依賴注入是一種更可取的方式。(130頁)

流行的「Martin Fowler將IoC改名為DI」的說法,Martin Fowler的原文在這裡:

Inversion of Control Containers and the Dependency Injection pattern

As a result I think we need a more specific name for this pattern. Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection.

大意是

已經存在某種模式,該模式被稱為IoC,但IoC太普遍,任何框架都IoC,為了讓表意更明確,決定用DI來精確指稱那個模式。

意思大概就是

IoC ioc = the_pattern;

DI di = (DI)ioc;

顯然,說the_pattern是IoC或DI都行,多態。但嚴格說IoC.class == DI.class肯定不為真,兩者還是有區別,是 is-a 的關係。

不過正如不少人把Service和ServiceImpl分開,但Service事實上永遠只有一個ServiceImpl實現一樣,IoC雖然理論上還有其他實現,但DI過於主流,以至於混用了。

另,以上是剛答的一個題Spring IoC有什麼好處呢? 的答案的一部分,感興趣可戳去。


ioc是目的,di是手段。ioc是指讓生成類的方式由傳統方式(new)反過來,既程序員不調用new,需要類的時候由框架注入(di),是同一件不同層面的解讀。


推薦閱讀:

Spring Security(二) -- Spring Security的Filter
springboot把web應用打包成jar包,那麼打包時jsp文件應該如何處理呢?
Spring Cloud雲服務架構代碼結構構建
jsonp跨域請求詳解——從繁至簡

TAG:Spring |