dagger2 循序漸進(jìn)學(xué)習(xí)(一)依賴注入基礎(chǔ)知識(shí)(包會(huì))

前言

dagger2 是目前由Google維護(hù)的一個(gè)依賴注入的框架绰上。也是火的一塌糊涂。目前筆者也正著手學(xué)習(xí)和使用在實(shí)際項(xiàng)目中渠驼。說(shuō)到依賴注入蜈块,網(wǎng)上很多文章都是從一個(gè)小小的案例兩個(gè)類的依賴關(guān)系進(jìn)行推演,說(shuō)到依賴注入就是為了更好的解耦。但是百揭,并沒(méi)有具體講為什么要這樣解耦爽哎,筆者就想深究一下。其實(shí)也不是什么高深的東西器一,依賴注入說(shuō)到底就是寫代碼的一種套路课锌,那么為什么有這種套路呢,所謂套路其實(shí)就是大家常說(shuō)的設(shè)計(jì)模式來(lái)或者面向?qū)ο罄泊祟惖钠盹酢2恢x者讀到這里有沒(méi)有靈光一閃渺贤。

依賴倒置原則

面向?qū)ο蟮牧笤瓌t之一,英文翻譯 Dependence Inversion Principle 请毛,一種特定的解耦形式志鞍,高層模塊不依賴于低層模塊的實(shí)現(xiàn)的細(xì)節(jié),依賴模塊被顛倒了方仿,可能有點(diǎn)難理解固棚。

依賴倒置原則遵循以下幾個(gè)關(guān)鍵點(diǎn):

1 高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象仙蚜;

2 抽象不應(yīng)該依賴細(xì)節(jié)

3 細(xì)節(jié)應(yīng)該依賴抽象此洲;

在java中,抽象就指 抽象類和接口類委粉,不能被實(shí)例化的呜师,細(xì)節(jié)就是這兩者的繼承類和實(shí)現(xiàn)類,其特點(diǎn)就是可以被實(shí)例化艳丛,就是說(shuō)可以new出來(lái)一個(gè)他的實(shí)例匣掸。高層模塊是調(diào)用端,低層模塊就是實(shí)現(xiàn)類氮双。依賴倒置在java中就是:<b>模塊之間依賴通過(guò)抽象發(fā)生碰酝,實(shí)現(xiàn)類之間不發(fā)生直接的依賴關(guān)系,其依賴關(guān)系是通過(guò)接口或抽象類產(chǎn)生的。</b>其實(shí)說(shuō)白了大白話戴差,就是面向接口編程送爸,面向抽象編程。面向接口編程是面向?qū)ο罄碚摰木柚慌汀K砸蕾嚨怪眠^(guò)程中的解耦形式袭厂,就是調(diào)用代碼中,都是用的接口類型的對(duì)象實(shí)例球匕,調(diào)用端無(wú)需知道纹磺,具體誰(shuí)實(shí)現(xiàn)的這個(gè)接口,從而實(shí)現(xiàn)解耦亮曹,在運(yùn)行和測(cè)試環(huán)境下橄杨,當(dāng)傳入不同的實(shí)現(xiàn)類可以完成不同的工作秘症。

依賴注入

通過(guò)上面的背景了解,我們知道:所謂 依賴注入 依賴就是調(diào)用端里面的接口對(duì)象式矫,或者說(shuō)這些對(duì)象就是高層調(diào)用端的依賴乡摹。如下:

Paste_Image.png

下面看一小段代碼

public class Car{

private Engine engine;

public Car(){
    engine = new Engine();
}
}

這段Java代碼中Car類持有了對(duì)Engine實(shí)例的引用,我們稱之為Car類對(duì)Engine類有一個(gè)依賴采转。由于沒(méi)有依賴注入聪廉,因此需要我們自己是在Car的構(gòu)造函數(shù)中創(chuàng)建Engine對(duì)象。
這樣明顯喪失了靈活性故慈,一切依賴都是在Car類的內(nèi)部創(chuàng)建板熊,Car與Engine嚴(yán)重耦合。一旦Engine創(chuàng)建方式發(fā)生了改變惯悠,我們就必須要去修改Car類的構(gòu)造函數(shù)另外我們也沒(méi)辦法替換動(dòng)態(tài)的替換依賴實(shí)例(比如我們想把Engine的品牌更換 或者更換型號(hào))邻邮。這類問(wèn)題在大型的商業(yè)項(xiàng)目中則更加嚴(yán)重竣况,往往A依賴B克婶、B依賴C、C依賴D丹泉、D依賴E情萤;一旦稍有改動(dòng)便牽一發(fā)而動(dòng)全身,想想都可怕摹恨!而依賴注入則很好的幫我們解決了這一問(wèn)題筋岛。且看下面的代碼

依賴注入其實(shí)并不神奇,我們?nèi)粘5拇a中很多都用到了依賴注入晒哄,但很少注意到它睁宰,也很少主動(dòng)使用依賴注入進(jìn)行解耦。這里我們簡(jiǎn)單介紹一下賴注入實(shí)現(xiàn)三種的方式寝凌。

1 構(gòu)造注入

    public class Car{

    private Engine engine;

    public Car(Engine engine){
        this.engine = engine;
    }
    }

2 接口注入 常見(jiàn)于mvp模式中

public interface Injection<T>{

    void inject(T t);
}

public class Car implements Injection<Engine>{

    private Engine engine;

    public Car(){}

    public void inject(Engine engine){
        this.engine = engine;
    }

}

3 set方法注入

public class Car {

    private Engine engine;

    public Car(){}

    public void setEngine(Engine engine){
        this.engine = engine;
    }
}

4 注解注入

public class Car{

    @Inject
    Engine engine;

    public Car(){}
}

這四段代碼都達(dá)到了解耦的目的柒傻,達(dá)到高內(nèi)聚低耦合的目的,保證代碼的健壯性较木、靈活性和可維護(hù)性红符。(依賴的實(shí)例化不在Car類內(nèi)部,就是不在這里new出來(lái)的)伐债,

至此预侯,所有的依賴注入功能及展示形式,是不是很簡(jiǎn)單7逅萎馅!他是如何解耦的稍微回味一下,很好理解虹蒋。今天就到這糜芳,對(duì)我自己說(shuō)晚安拣技!

文章索引
dagger2 循序漸進(jìn)學(xué)習(xí)(一)依賴注入基礎(chǔ)知識(shí)(包會(huì))
dagger2 循序漸進(jìn)學(xué)習(xí)(二)
dagger2 循序漸進(jìn)學(xué)習(xí)(三) 實(shí)例1,application中的應(yīng)用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耍目,一起剝皮案震驚了整個(gè)濱河市膏斤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邪驮,老刑警劉巖莫辨,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異毅访,居然都是意外死亡沮榜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門喻粹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蟆融,“玉大人,你說(shuō)我怎么就攤上這事守呜⌒退郑” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵查乒,是天一觀的道長(zhǎng)弥喉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)玛迄,這世上最難降的妖魔是什么由境? 我笑而不...
    開(kāi)封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蓖议,結(jié)果婚禮上虏杰,老公的妹妹穿的比我還像新娘。我一直安慰自己勒虾,他們只是感情好纺阔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著从撼,像睡著了一般州弟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上低零,一...
    開(kāi)封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天婆翔,我揣著相機(jī)與錄音,去河邊找鬼掏婶。 笑死啃奴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雄妥。 我是一名探鬼主播最蕾,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼依溯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了瘟则?” 一聲冷哼從身側(cè)響起黎炉,我...
    開(kāi)封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎醋拧,沒(méi)想到半個(gè)月后慷嗜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丹壕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年庆械,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菌赖。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缭乘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琉用,到底是詐尸還是另有隱情堕绩,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布辕羽,位于F島的核電站逛尚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏刁愿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一到逊、第九天 我趴在偏房一處隱蔽的房頂上張望铣口。 院中可真熱鬧,春花似錦觉壶、人聲如沸脑题。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叔遂。三九已至,卻和暖如春争剿,著一層夾襖步出監(jiān)牢的瞬間已艰,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蚕苇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哩掺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓涩笤,卻偏偏與公主長(zhǎng)得像嚼吞,于是被迫代替她去往敵國(guó)和親盒件。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容