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