更新時(shí)間:2021-11-23 來(lái)源:黑馬程序員 瀏覽量:
計(jì)算機(jī)編程是把一些實(shí)際問(wèn)題組織并抽象起來(lái)的過(guò)程,編寫(xiě)程序時(shí),開(kāi)發(fā)人員經(jīng)常使用團(tuán)隊(duì)其他成員編寫(xiě)的代碼或者一些第三方工具(如著名的開(kāi)源庫(kù)或者框架)。隨著項(xiàng)目的擴(kuò)大.項(xiàng)目中需要依賴的模塊會(huì)越來(lái)越多,這時(shí)如何有效地組織這些模塊是非常重要的。依賴注入能夠有效解決模塊問(wèn)依賴的問(wèn)題。
依賴注人的英文是Dependency Injection,在軟件開(kāi)發(fā)中縮寫(xiě)為DI。依賴注入應(yīng)用了控制反轉(zhuǎn)的設(shè)計(jì)思想,因此很多人也稱依賴注人為控制反轉(zhuǎn)。控制反轉(zhuǎn)(Inversion of Control,loC)是一個(gè)重要的面向?qū)ο缶幊痰姆▌t,用來(lái)減少計(jì)算機(jī)程序的耦合問(wèn)題,它一般分為兩種類型——依賴注人和依賴查找(Dependency Lookup)。簡(jiǎn)單地說(shuō),控制反轉(zhuǎn)是一種設(shè)計(jì)思想,而依賴注入是控制反轉(zhuǎn)思想的一種實(shí)現(xiàn)方式。
在程序開(kāi)發(fā)中,組件獲取依賴通常有3種方式。
①使用new運(yùn)算符直接創(chuàng)建出依賴。該方式是在自己的應(yīng)用程序中創(chuàng)建依賴對(duì)象。它有一個(gè)弊端,就是當(dāng)程序的多個(gè)模塊都需要應(yīng)用一個(gè)對(duì)象時(shí),會(huì)造成模塊之間的高耦合;如果一個(gè)對(duì)象參數(shù)過(guò)多,有可能還需要對(duì)象創(chuàng)建其他參數(shù)對(duì)象,所以這種方式無(wú)法適合復(fù)雜的應(yīng)用。
②直接引用依賴,如引用全局變量。該方式需要一定的條件,例如依賴對(duì)象對(duì)于用戶對(duì)象是直接開(kāi)放的,這里不做討論。
③在需要的地方傳人依賴。該方式便是依賴注入,它的重要特點(diǎn)是在系統(tǒng)運(yùn)行中可以把創(chuàng)建依賴對(duì)象的控制權(quán)交給IoC容器,由IoC容器動(dòng)態(tài)地通過(guò)注入的方式,向某個(gè)對(duì)象提供它所需要的其他對(duì)象。這樣對(duì)象與對(duì)象之間松散耦合,方便測(cè)試,利于功能復(fù)用,更重要的是使得程序的整個(gè)體系結(jié)構(gòu)變得非常靈活。
依賴注人對(duì)編程帶來(lái)的最大改變不是從代碼上(而是從思想上發(fā)生了“主從換位”的變化,把應(yīng)用程序向依賴對(duì)象主動(dòng)出擊變?yōu)閼?yīng)用程序被動(dòng)的等待,由IoC容器來(lái)創(chuàng)建并注入它所需要的資源。例如將IoC容器看作一個(gè)“保姆”,“我”看作用戶對(duì)象,“蛋糕”看作依賴對(duì)象:當(dāng)“我”想吃“蛋糕”時(shí)不是自己來(lái)做,而是告訴“保姆”,“保姆”做好之后交給“我”,整個(gè)過(guò)程如圖4-9所示。