IoC與DI
首先想說說IoC(Inversion of Control,控制倒轉(zhuǎn))喜鼓。
這是spring的核心际乘,貫穿始終坡倔。所謂IoC,對(duì)于spring框架來說,就是由spring來負(fù)責(zé)控制對(duì)象的生命周期和對(duì)象間的關(guān)系罪塔。
舉個(gè)例子投蝉,我們是如何找女朋友的?常見的情況是征堪,我們到處去看哪里有長(zhǎng)得漂亮身材又好的mm瘩缆,然后打聽她們的興趣愛好、qq號(hào)佃蚜、電話號(hào)…庸娱,想辦法認(rèn)識(shí)她們,投其所好送其所好谐算,然后嘿嘿…這個(gè)過程是復(fù)雜深?yuàn)W的熟尉,我們必須自己設(shè)計(jì)和面對(duì)每個(gè)環(huán)節(jié)。
傳統(tǒng)的程序開發(fā)也是如此洲脂,在一個(gè)對(duì)象中斤儿,如果要使用另外的對(duì)象,就必須得到它(自己new一個(gè)恐锦,或者從JNDI中查詢一個(gè))往果,使用完之后還要將對(duì)象銷毀(比如Connection等),對(duì)象始終會(huì)和其他的接口或類藕合起來一铅。
那么IoC是如何做的呢陕贮?
有點(diǎn)像通過婚介找女朋友,在我和女朋友之間引入了一個(gè)第三者:婚姻介紹所馅闽。
婚介管理了很多男男女女的資料飘蚯,我可以向婚介提出一個(gè)列表,告訴它我想找個(gè)什么樣的女朋友福也,比如長(zhǎng)得像李嘉欣局骤,身材像林熙雷,技術(shù)像齊達(dá)內(nèi)之類的暴凑,然后婚介就會(huì)按照我們的要求峦甩,提供一個(gè)mm,我們只需要去和她談戀愛现喳、結(jié)婚就行了凯傲。
簡(jiǎn)單明了,如果婚介給我們的人選不符合要求嗦篱,我們就會(huì)拋出異常冰单。整個(gè)過程不再由我自己控制,而是有婚介這樣一個(gè)類似容器的機(jī)構(gòu)來控制灸促。
Spring所倡導(dǎo)的開發(fā)方式就是如此:
所有的類都會(huì)在spring容器中登記诫欠,告訴spring你是個(gè)什么東西涵卵,你需要什么東西,然后spring會(huì)在系統(tǒng)運(yùn)行到適當(dāng)?shù)臅r(shí)候荒叼,把你要的東西主動(dòng)給你轿偎,同時(shí)也把你交給其他需要你的東西。
所有的類的創(chuàng)建被廓、銷毀都由 spring來控制坏晦,也就是說控制對(duì)象生存周期的不再是引用它的對(duì)象,而是spring嫁乘。對(duì)于某個(gè)具體的對(duì)象而言昆婿,以前是它控制其他對(duì)象,現(xiàn)在是所有對(duì)象都被spring控制亦渗,所以這叫控制反轉(zhuǎn)挖诸。
IoC的一個(gè)重點(diǎn)是在系統(tǒng)運(yùn)行中,動(dòng)態(tài)的向某個(gè)對(duì)象提供它所需要的其他對(duì)象法精。
這一點(diǎn)是通過DI(Dependency Injection多律,依賴注入)來實(shí)現(xiàn)的。
比如對(duì)象A需要操作數(shù)據(jù)庫搂蜓,以前我們總是要在A中自己編寫代碼來獲得一個(gè)Connection對(duì)象狼荞,有了 spring我們就只需要告訴spring,A中需要一個(gè)Connection帮碰,至于這個(gè)Connection怎么構(gòu)造相味,何時(shí)構(gòu)造,A不需要知道殉挽。
在系統(tǒng)運(yùn)行時(shí)丰涉,spring會(huì)在適當(dāng)?shù)臅r(shí)候制造一個(gè)Connection,然后像打針一樣斯碌,注射到A當(dāng)中一死,這樣就完成了對(duì)各個(gè)對(duì)象之間關(guān)系的控制。A需要依賴 Connection才能正常運(yùn)行傻唾,而這個(gè)Connection是由spring注入到A中的投慈,依賴注入的名字就這么來的。
那么DI是如何實(shí)現(xiàn)的呢冠骄? Java 1.3之后一個(gè)重要特征是反射(reflection)伪煤,它允許程序在運(yùn)行的時(shí)候動(dòng)態(tài)的生成對(duì)象、執(zhí)行對(duì)象的方法凛辣、改變對(duì)象的屬性抱既,spring就是通過反射來實(shí)現(xiàn)注入的。