IoC(Inversion Of Controller)和DI(Dependency Indection) 的區(qū)別

????有部分Java開發(fā)者對IoC和Di的概念有些混淆,認(rèn)為二者是對等的,實際上IoC其實有兩種方式:一種就是DI,而另一種是DL(Dependency Lookup,依賴查找).

????前者是當(dāng)前軟件實體被動接受其依賴的其他自減被IoC容器注入,而后者則是當(dāng)前軟件試題主動去某個服務(wù)注冊地查找起依賴的服務(wù),概念之間的關(guān)系如圖所示:

IoC相關(guān)概念示意圖

? ? 我們通常提到的SpringI哦C,實際上是指Spring框架提供的IoC容器實現(xiàn)(IoC Container),而使用Spring IoC容器的一個典型代碼片段就是:

public class App {

????public static void main(String[] args) {

????????????ApplicationContext context = new FileSystemXmlApplicationContext("...");

? ? ? ? ? ? //...

????????????MockServoce service = context.getBean(MockService.class); ???????????

?????????????service.doSomething();

????????}

}

????????任何一個使用Spring框架構(gòu)建的獨立的Java應(yīng)用(Standalone Java Application),通常都會存在一行類似于"context.getBean(...);"的代碼中,實際上,折行代碼做的就是DL的工作,而構(gòu)建的任何一種IoC容器背后(比如BeanFactory或者ApplicationContent)發(fā)生的事情.則更多是DI的過程(也可能有部分DL的邏輯用于對接遺留系統(tǒng)).

? ? Spring的IoC容器中發(fā)生的事情其實也很簡單,總結(jié)下來即兩個階段:

(1)收集和注冊Bean

(2) 分析和組裝Bean

階段一:收集和注冊Bean

????????第一個階段可以認(rèn)為是構(gòu)建和收集bean定義的階段饮怯,在這個階段中嵌戈,我們可以通過XML或者JavaConfig代碼的方式定義一些bean,然后通過手動組裝或者讓容器基于某些機(jī)制自動掃描的形式芦拿,將這些bean定義收集到IoC容器中桐磁。

? ? ? ? 假設(shè)我們以XML配置的形式來收集并注冊單一Bean,一般形式如下:

<bean id="mockService" class="..MockServiceImpl">

...

</bean>l

? ? ? 如果嫌逐個手機(jī)Bean定義麻煩,想批量地注冊到IoC容器中,我們也可以通過XML Schema形式的配置進(jìn)行批量掃描并采集和注冊:

<context:component-scan base_package=""com.keevol">


階段二:分析和組裝

????????當(dāng)?shù)谝浑A段完成后,我們可以先暫時認(rèn)為IoC容器中充斥著一個個獨立的Bean,它們之間沒有任何關(guān)系.但實際上,它們之間是有依賴關(guān)系的,所以,IoC容器在第二階段要干的事情就是分析這些已經(jīng)在IoC容器之中的Bean,然后根據(jù)它們之間的依賴關(guān)系先后組裝它們.如果IoC容器發(fā)現(xiàn)某個Bean依賴另一個Bean,它就會將這另一個Beann注入給依賴它的那個Bean,直到所有Beand的依賴都注入完成,所有Bean都"整裝待發(fā)",這個IoC容器的工作即算完成.

? ? ? ? 至于分析和組裝的依據(jù),Spring框架最早是通過XML配置文件的形式在I描述Bean與Bean之間的關(guān)系的,隨著Java業(yè)界研發(fā)技術(shù)和理念的轉(zhuǎn)變,預(yù)計Java代碼和Annotation元信息的描述方式也日漸興盛(比如@Autowired和@Inject),但是不管是用哪種方式,都只是為了簡化綁定邏輯描述的各種"表象",最終都是為本階段的最終目的服務(wù).

提示:

????????很多Java開發(fā)者一定認(rèn)為Spring的XML配置文件是一種配置(Configration),但本質(zhì)上,這些配置文件更應(yīng)該是一種代碼形式,XML在這里其實可以看作一種DSL,它用來表述的是Bean與Bean之間的依賴綁定關(guān)系,諸君還記得沒有IoC容器的年代和自己寫代碼新建(nenw)對象并配置(set)依賴.

? ? ? ? ? ? ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悔耘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子我擂,更是在濱河造成了極大的恐慌衬以,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件校摩,死亡現(xiàn)場離奇詭異看峻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)衙吩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門互妓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坤塞,你說我怎么就攤上這事冯勉。” “怎么了尺锚?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵珠闰,是天一觀的道長。 經(jīng)常有香客問我瘫辩,道長伏嗜,這世上最難降的妖魔是什么坛悉? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮承绸,結(jié)果婚禮上裸影,老公的妹妹穿的比我還像新娘。我一直安慰自己军熏,他們只是感情好轩猩,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荡澎,像睡著了一般均践。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摩幔,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天彤委,我揣著相機(jī)與錄音,去河邊找鬼或衡。 笑死焦影,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的封断。 我是一名探鬼主播斯辰,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坡疼!你這毒婦竟也來了彬呻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柄瑰,失蹤者是張志新(化名)和其女友劉穎废岂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狱意,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡湖苞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了详囤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片财骨。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖藏姐,靈堂內(nèi)的尸體忽然破棺而出隆箩,到底是詐尸還是另有隱情,我是刑警寧澤羔杨,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布捌臊,位于F島的核電站,受9級特大地震影響兜材,放射性物質(zhì)發(fā)生泄漏理澎。R本人自食惡果不足惜逞力,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望糠爬。 院中可真熱鬧寇荧,春花似錦、人聲如沸执隧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镀琉。三九已至峦嗤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屋摔,已是汗流浹背寻仗。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留凡壤,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓耙替,卻偏偏與公主長得像亚侠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俗扇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354