網(wǎng)上搜了一下,感覺(jué)還是不能理解
認(rèn)證0級(jí)講師
依賴(lài)注入:程序運(yùn)行過(guò)程中,如需另一個(gè)對(duì)象協(xié)作(調(diào)用它的方法、訪(fǎng)問(wèn)他的屬性)時(shí),無(wú)須在代碼中創(chuàng)建被調(diào)用者,而是依賴(lài)于外部容器的注入
下面這個(gè)例子可能更加有趣
理解依賴(lài)注入:
一個(gè)人(Java實(shí)例,調(diào)用者)需要一把斧子(Java實(shí)例,被調(diào)用者)
在原始社會(huì)里,幾乎沒(méi)有社會(huì)分工;需要斧子的人(調(diào)用者)只能自己去磨一把斧子(被調(diào)用者);對(duì)應(yīng)情形為:Java程序里的調(diào)用者自己創(chuàng)建被調(diào)用者,通常采用new關(guān)鍵字調(diào)用構(gòu)造器創(chuàng)建一個(gè)被調(diào)用者
進(jìn)入工業(yè)社會(huì),工廠(chǎng)出現(xiàn)了,斧子不再由普通人完成,而在工廠(chǎng)里被生產(chǎn)出來(lái),此時(shí)需要斧子的人(調(diào)用者)找到工廠(chǎng),購(gòu)買(mǎi)斧子,無(wú)須關(guān)心斧子的制造過(guò)程;對(duì)應(yīng)簡(jiǎn)單工廠(chǎng)設(shè)計(jì)模式,調(diào)用者只需定位工廠(chǎng),無(wú)須管理被調(diào)用者的具體實(shí)現(xiàn)
進(jìn)入“共產(chǎn)主義”社會(huì),需要斧子的人甚至無(wú)須定位工廠(chǎng),“坐等”社會(huì)提供即可;調(diào)用者無(wú)須關(guān)心被調(diào)用者的實(shí)現(xiàn),無(wú)須理會(huì)工廠(chǎng),等待Spring依賴(lài)注入
總之依賴(lài)注入的意思是你需要的東西不是由你創(chuàng)建的,而是第三方,或者說(shuō)容器提供給你的。這樣的設(shè)計(jì)符合正交性,即所謂的松耦合。
個(gè)人理解,依賴(lài)注入是調(diào)用者僅通過(guò)聲明某個(gè)組件就可以獲得組件的控制權(quán),而對(duì)該組件的依賴(lài)關(guān)系管理、查找、加載由外部完成。
AngularJS中是由$injector
進(jìn)行這項(xiàng)工作。
比如,我在一個(gè)服務(wù)中注入了$http
,并用hehe
進(jìn)行調(diào)用:
.service('myService',['$http',function(hehe) {
this.getUserActivities = function(username){
return hehe({
method: 'JSONP',
url:'https://api.github.com/users/'+username+'/events?callback=JSON_CALLBACK'
});
}
}])
依賴(lài)注入就是你不用關(guān)心對(duì)象的生命周期,什么時(shí)候被創(chuàng)建,什么時(shí)候銷(xiāo)毀,只需直接使用即可,對(duì)象的生命周期由提供依賴(lài)注入的框架來(lái)管理。
我補(bǔ)充一點(diǎn):關(guān)于依賴(lài)注入和控制反轉(zhuǎn)其實(shí)是一個(gè)概念的。
@Wang_Bourne
http://www.cnblogs.com/kinglongdai/p/3269049.html
慕課網(wǎng):http://www.imooc.com/video/4907
理論上理解總是有點(diǎn)談玄論道的感覺(jué) 推薦你看一些依賴(lài)注入的開(kāi)源框架 比如RoboGuice 實(shí)踐出真知
sorry 走錯(cuò)門(mén)了 沒(méi)有看分類(lèi) RoboGuice是android的框架 不過(guò)道理是一樣的
依賴(lài)注入(Dependency Injection,DI)也叫也被稱(chēng)為反轉(zhuǎn)控制(Inversion of Control, IoC),即將類(lèi)和類(lèi)、方法和方法之間的關(guān)系通過(guò)第三方(如配置文件)進(jìn)行“注入”,不需要類(lèi)或類(lèi)方法自己去解決彼此間的調(diào)用關(guān)系。傳統(tǒng)應(yīng)用程序通常是在類(lèi)內(nèi)部執(zhí)行代碼中主動(dòng)創(chuàng)建這個(gè)類(lèi)所依賴(lài)的其它對(duì)象,從而導(dǎo)致類(lèi)與類(lèi)之間發(fā)生緊密耦合,使得類(lèi)難于測(cè)試和隔離,最終導(dǎo)致系統(tǒng)的擴(kuò)展和維護(hù)異常困難。依賴(lài)注入用來(lái)解決組件之間依賴(lài)關(guān)系、配置及生命周期管理,通過(guò)轉(zhuǎn)移對(duì)象控制權(quán),可以解決類(lèi)之間的耦合問(wèn)題,對(duì)象與對(duì)象之間是松散耦合關(guān)系,更重要的是使得應(yīng)用程序體系結(jié)構(gòu)變得非常靈活,很好的體現(xiàn)了面向?qū)ο蟮脑O(shè)計(jì)法則之一—依賴(lài)設(shè)計(jì)原則,即著名的好萊塢原則:“Don’t call us, we’ll call you.(不要調(diào)用我們,我們會(huì)調(diào)用你)。
angular.js 里面就很多這種思想。
包括 var net = require('net');
都醬紫的。
依賴(lài)注入
其實(shí)就是說(shuō)目前的對(duì)象所具有的特征屬性是依賴(lài)外部注入的對(duì)象的來(lái)決定的。
好比你家開(kāi)個(gè)制鞋廠(chǎng), 有個(gè)生產(chǎn)鞋的方法 make。
function shoes() {
this.make = function() {
....
}
}
由于市場(chǎng)需要,有一些大牌運(yùn)動(dòng)鞋公司需要你們家工廠(chǎng)代工生產(chǎn),會(huì)給你一大包原材料,你們工廠(chǎng)拿到原材料生產(chǎn),然后貼牌即可。
function shoes(material) {
this.material = material;
this.make = function() {
....
}
}
這樣,如果是 nike 需要你代工,給你 nike 家的材料對(duì)象,你就可以生產(chǎn)出 nike 家的運(yùn)動(dòng)鞋,adidas 家給你他們家的材料,你就可以生產(chǎn)出他們家的鞋子。
也就是你們家鞋廠(chǎng)生產(chǎn)的鞋子到底是 A 家還是 N 家的鞋子,是依賴(lài)于提供你材料的是 A 家還是 N 家。
在面向?qū)ο缶幊讨?,我們?jīng)常處理處理的問(wèn)題就是解耦,程序的耦合性越低表明這個(gè)程序的可讀性以及可維護(hù)性越高??刂品崔D(zhuǎn)(Inversion of Control或IoC)就是常用的面向?qū)ο缶幊痰脑O(shè)計(jì)原則,使用這個(gè)原則我們可以降低耦合性。其中依賴(lài)注入是控制反轉(zhuǎn)最常用的實(shí)現(xiàn)。
具體訪(fǎng)問(wèn)說(shuō)說(shuō)依賴(lài)注入
非常簡(jiǎn)單的個(gè)人理解,依賴(lài)注入其實(shí)并不難,是一件很自然的事情,現(xiàn)實(shí)生活其實(shí)比程序難:
依賴(lài)注入:你是一個(gè)人,你要去打獵,需要一把槍?zhuān)?這個(gè)時(shí)候有兩個(gè)選擇,第一個(gè)選擇,你自己去造,顯然不可取,這就是強(qiáng)耦合。第二個(gè)選擇,你去商店里面買(mǎi),這就是依賴(lài)注入,因?yàn)槭菑耐饷孀⑷虢o你的,通過(guò)買(mǎi),解除自己造的難題,通過(guò)注入,解除依賴(lài)。多簡(jiǎn)單的事啊。
控制反轉(zhuǎn)準(zhǔn)則:依賴(lài)于抽象,而不要依賴(lài)于具體的東西, 你去買(mǎi)槍的時(shí)候,你的腦海中要有這個(gè)槍的抽象概念,你只需要告訴槍店老板,這個(gè)槍在你腦海中的抽象形象就可以了。而且你是神創(chuàng)造的,神要測(cè)試一下你這個(gè)獵人的時(shí)候,神如果要給你去創(chuàng)造一把槍就比較麻煩,但是如果你的袋子里面有一張槍的說(shuō)明書(shū),那就好辦了,神分分鐘幫你弄出一把槍來(lái)。說(shuō)得更土一點(diǎn),不要去依賴(lài)具體的槍?zhuān)ヒ蕾?lài)槍的說(shuō)明書(shū),這就是控制反轉(zhuǎn)準(zhǔn)則。很顯然,現(xiàn)實(shí)生活中,我們就是這樣去干的。
容器:相當(dāng)于現(xiàn)實(shí)生活中的一個(gè)超級(jí)厲害的工廠(chǎng),神(程序員)負(fù)責(zé)不斷的給他升級(jí),一般都是bind, 你告訴他什么,他都可以幫你生產(chǎn),然后再免費(fèi)送給你。所有的臟活累活,工廠(chǎng)都幫你干了,所在而你只負(fù)責(zé)在一邊,享受生活。這個(gè)工廠(chǎng),是實(shí)現(xiàn)依賴(lài)注入的難度所在。
再進(jìn)一步的理解,依賴(lài)注入,就等于,共產(chǎn)主義社會(huì)。