控制反轉(zhuǎn):
控制反轉(zhuǎn)的資料的集合
參考一、
標(biāo)題:向依賴關(guān)系宣戰(zhàn)----依賴倒置、控制反轉(zhuǎn)和依賴注入辨析
url:http://www.contextfree.net/wangyw/source/dip_ioc.html
說明:詳細(xì)分析了幾個概念的不同
參考二、
Spring guide
參考三、
WebWork In Action IOC一章
參考四、
Martin fowler的文章
http://www.tkk7.com/Files/dreamstone/DependencyInjection.rar
強烈建議大家看一下第一篇文章和第四篇,作者寫的真的很好
對比依賴倒置,控制反轉(zhuǎn),依賴注入?
---------------------------------------------
1,依賴倒置:
先說明什么是"正置"
正置就是,當(dāng)你設(shè)計一些類庫的時候,考慮到用戶的需要定義一些接口,用戶的應(yīng)用程序依賴這些接口
對比"正置"和"倒置"
正置:應(yīng)用依賴接口,接口由類庫設(shè)計者定義
優(yōu)點:類庫實現(xiàn)上自由度大,實現(xiàn)容易。
缺點:類庫設(shè)計復(fù)雜,要預(yù)測應(yīng)用的需求,同時有可能不符合應(yīng)用的需求
倒置:應(yīng)用定義接口,類庫設(shè)計者實現(xiàn)接口,按照接口實現(xiàn)類庫
優(yōu)點:類庫設(shè)計不再需要預(yù)測,肯定符合應(yīng)用需求
缺點:類庫有可能難以實現(xiàn)
簡單來說,正置和倒置的區(qū)別在于,誰來制定標(biāo)準(zhǔn)。現(xiàn)實中因為需求的定義是客戶決定的,所以倒置更
適合程序的設(shè)計。從需求出發(fā),到底層實現(xiàn)。
使用目的:便于應(yīng)用按照需求設(shè)計
關(guān)注點:接口的設(shè)計
---------------------------------------------
2,控制反轉(zhuǎn):
正常的控制:
沒有一定的控制流程,下一個流程由上一個流程決定,實現(xiàn)應(yīng)用需要自己控制流程
控制反轉(zhuǎn) :
抽象出固定的流程,實現(xiàn)應(yīng)用就是填充流程中的一個個點。
所有的框架都是基于控制反轉(zhuǎn)的。Windows GUI開發(fā)也多是這樣。
目的:高度抽象,設(shè)計框架
關(guān)注點:流程的設(shè)計
---------------------------------------------
3,依賴注入
原始的情況:
應(yīng)用自己new 類,或者使用工廠模式創(chuàng)建類
依賴注入:
容器創(chuàng)建類,通過構(gòu)造函數(shù),setter方法,接口等方法,運行時"注入"到應(yīng)用中
實現(xiàn):
Spring setter方法
webwork IOC 實現(xiàn)接口的方法
pico 構(gòu)造函數(shù)的方法
目的:完全分離開發(fā)
關(guān)注點:構(gòu)造對象
---------------------------------------------
關(guān)系:
"控制反轉(zhuǎn)"是"依賴倒置"的一種,"依賴注入"是在"控制反轉(zhuǎn)"的基礎(chǔ)上,讓容器來完成"注入"過程。
---------------------------------------------
最需要依賴注入的情況:
"調(diào)用者"和多個"被調(diào)用者"分別開發(fā),分別打包分發(fā),實施者根據(jù)實際情況決定使用哪個"被調(diào)用者"被使用
做成可配制的,這種情況是經(jīng)常需要的。這個時候調(diào)用者內(nèi)不能出現(xiàn)這樣的代碼:
interface inter = new interfaceimplA();類似的語句。因為使用的可能是interfaceimplB
為了避免這樣語句的出現(xiàn),我們直接使用接口,而對象的構(gòu)造推遲,讓容器根據(jù)實施者的配制來構(gòu)造,并注入
正確的位置。