Dagger2神器入門(三)

前言

Dagger2神器入門(二)中辆影,我們通過簡單的demo初步入門了Dagger2的簡單使用,我們了解了@Inject鸟雏,@Module妒穴,@Provides和@Componet等注解的使用方法。在這一章節(jié)中我們主要解決上篇文章中留下的3個問題:

1 為什么要使用Dagger2來替代文章一開頭的寫法靡努?
2 如果@Inject的構造器有多個怎么辦坪圾?
3 如何存在依賴鏈怎么辦?

1 為什么要使用Dagger2來替代文章一開頭的寫法惑朦?

我們先回回顧一下文章開頭的寫法:

public class Car {
    private Engine engine;
    private Seat seat;
    private Wheel wheel;
    public Car() {
        engine = new Engine();
        seat = new Seat();
        wheel = new Wheel();
        Log.d(Config.TAG, "new Car()");
    }
  }

再看看使用Dagger2之后的代碼:

public class Car {

  @Inject
  Engine engine;
  @Inject
  Seat seat;
  @Inject
  Wheel wheel;
  //  private Engine engine;
  //  private Seat seat;
  //  private Wheel wheel;

  public Car() {
  //  engine = new Engine();
  //  seat = new Seat();
  //  wheel = new Wheel();
    DaggerCarComponent
        .builder()
        .carModule(new CarModule())
        .build()
        .inject(this);
  Log.d(Config.TAG, "new Car()");

  }
}

那么問題來了兽泄?這樣的寫法好處在哪?
1 如果我修改Engine類的構造器漾月,那么對于第一種做法應該同時修改Car構造器的病梢;如果還有N個地方依賴了我的Engine構造器怎么辦?只能一個一個的去修改梁肿,這就增加了代碼修改難度蜓陌;而使用Dagger2呢?你的@Inject依賴還是不會變 吩蔑,只要修改一下Module類即可钮热。
2 再來看看第一種寫法,雖然目的達到了烛芬,但是耦合度非常高隧期;而第二種寫法達到了解耦的目的。不能絕對的說哪種方式更好赘娄,這得看你的實際項目仆潮。

2 @Inject注解的Class有多個構造器怎么辦?

神馬意思呢遣臼?比如我們的車座可能會帶一個座套性置,那么車座可能提供無車套車座和有車套車座。

public class Seat {
    //默認無車套車座
    public Seat(){
        Log.d(Config.TAG,"new Seat()");
    }
    //提供有車套車座
    public Seat(String str){
        Log.d(Config.TAG,str);
    }
}

那么接著第二章代碼揍堰,會輸出啥呢蚌讼?

  06-28 22:20:28.980 15053-15053/? D/TAG: new Engine()
  06-28 22:20:28.981 15053-15053/? D/TAG: new Seat()
  06-28 22:20:28.981 15053-15053/? D/TAG: new Wheel()
  06-28 22:20:28.981 15053-15053/? D/TAG: new Car()

還是一樣的輸出辟灰?why?我們要想到我們提供依賴者篡石?

    @Provides
    public Seat provideSeat(){
        return new Seat();
    }

因為這里提供的構造器就是無參的,我們換一個有參數(shù)的試試西采?

     @Provides
      public Seat provideSeat(){
          return new Seat("有車套");
    }

輸出

  06-28 22:22:55.886 17342-17342/? D/TAG: new Engine()
  06-28 22:22:55.886 17342-17342/? D/TAG: 有車套
  06-28 22:22:55.886 17342-17342/? D/TAG: new Wheel()
  06-28 22:22:55.886 17342-17342/? D/TAG: new Car()

那么有人會問凰萨,一個類能夠提供2個provide呢?在Module中像這樣寫:

 @Provides
 public Seat provideSeat(){
      return new Seat();
  }
 @Provides
 public Seat provideSeat2(){
      return new Seat("有車套");
  }

我們通過代碼試試不就知道了械馆?

Error:(13, 11) 錯誤: com.bae.basicandext.dagger.blog.bean.Seat is bound multiple times:
@Provides com.bae.basicandext.dagger.blog.bean.Seat com.bae.basicandext.dagger.blog.dagger.CarModule.provideSeat()
@Provides com.bae.basicandext.dagger.blog.bean.Seat com.bae.basicandext.dagger.blog.dagger.CarModule.provideSeats()

錯誤顯示Seat類被綁定了多次胖眷。也就是說一個類只能提供一個構造器作為依賴。到這一步霹崎,我希望能夠找到相關說明文檔來再次驗證自己的想法珊搀,因為我擔心自己代碼的錯誤導致自己錯誤的理解,官方文檔給出的解釋是100%正確的尾菇。

@Inject官方解釋

@Inject can apply to at most one constructor per class境析。

這就驗證了我的做法是正確的,同時也驗證我的猜想是正確的派诬。

3 如果存在依賴鏈怎么辦劳淆?

什么意思?這讓我想起了設計模式中的責任鏈模式默赂,在學習的過程中不斷的聯(lián)想沛鸵,這是一種比較好的學習方法,因為我們要遵循艾賓浩斯遺忘曲線去學習缆八,不但的鞏固才能不斷的提高自己曲掰。

那么我們這里的依賴鏈是怎么回事呢?其實很簡單奈辰,比如A依賴B栏妖,B依賴C,C依賴D...
回歸到我們的例子冯挎,我們的車座要依賴于皮革(leather)底哥,那么我們怎么辦?

public class Leather {
public Leather(){
    Log.d(Config.TAG,"new Leather()");
  }
}

修改一下我們的車座房官,提供皮革依賴注入

public class Seat {
    private Leather leather;
    public Seat(){
        Log.d(Config.TAG,"new Seat()");
    }
    public Seat(String str){
        Log.d(Config.TAG,str);
    }
    public Seat(Leather leather){
        this.leather = leather;
        Log.d(Config.TAG,"new Seat(Leather)");
    }
}

可以看到趾徽,我們在原有的基礎之上增加了一個構造器Seat(leather), 而該構造器是存在依賴參數(shù)的。而我們需要在@Inject的時候就能自動調(diào)用該構造器翰守,怎么辦孵奶? 在之前講到的提供依賴Module類修改

@Provides
public Seat provideSeat(Leather leather){
    return new Seat(leather);
}

僅僅這樣是不行的,因為Module去尋找依賴Leather的時候會找不到對應對象蜡峰,還需要添加

@Provides
public Leather provideLeather(){
    return new Leather();
}

這樣在執(zhí)行provideSeat() 時了袁,能夠找到相應的Leather();
那么我們run下朗恳,先猜猜在

 @Inject
 Seat seat;

這個中如何執(zhí)行的?

07-07 01:00:41.035 8144-8144/com.bae.basicandext D/TAG: new Engine()
07-07 01:00:41.035 8144-8144/com.bae.basicandext D/TAG: new Leather()
07-07 01:00:41.035 8144-8144/com.bae.basicandext D/TAG: new Seat(Leather)
07-07 01:00:41.035 8144-8144/com.bae.basicandext D/TAG: new Wheel()
07-07 01:00:41.035 8144-8144/com.bae.basicandext D/TAG: new Car()

很明了了载绿,它能夠自動找到Leather依賴粥诫。其實關鍵的關鍵還是在Module類中。

講到這里崭庸,相信大家對Dagger2有一個初步認識怀浆,并且結合相關Api文檔能夠達到入門的目的了。接下來會一起學習一些其他Dagger2注解怕享,期待吧...

上一篇Dagger2神器入門(二)
下一篇Dagger2神器入門(四)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載执赡,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末函筋,一起剝皮案震驚了整個濱河市沙合,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跌帐,老刑警劉巖首懈,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異含末,居然都是意外死亡猜拾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門佣盒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挎袜,“玉大人,你說我怎么就攤上這事肥惭《⒁牵” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵蜜葱,是天一觀的道長全景。 經(jīng)常有香客問我,道長牵囤,這世上最難降的妖魔是什么爸黄? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮揭鳞,結果婚禮上炕贵,老公的妹妹穿的比我還像新娘。我一直安慰自己野崇,他們只是感情好称开,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般鳖轰。 火紅的嫁衣襯著肌膚如雪清酥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天蕴侣,我揣著相機與錄音焰轻,去河邊找鬼。 笑死昆雀,一個胖子當著我的面吹牛鹦马,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忆肾,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼菱肖!你這毒婦竟也來了客冈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤稳强,失蹤者是張志新(化名)和其女友劉穎场仲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體退疫,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡渠缕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了褒繁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亦鳞。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖棒坏,靈堂內(nèi)的尸體忽然破棺而出燕差,到底是詐尸還是另有隱情,我是刑警寧澤坝冕,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布徒探,位于F島的核電站,受9級特大地震影響喂窟,放射性物質(zhì)發(fā)生泄漏测暗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一磨澡、第九天 我趴在偏房一處隱蔽的房頂上張望碗啄。 院中可真熱鬧,春花似錦钱贯、人聲如沸挫掏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尉共。三九已至褒傅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袄友,已是汗流浹背殿托。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剧蚣,地道東北人支竹。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像鸠按,于是被迫代替她去往敵國和親礼搁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

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

  • Dagger2 入門 2016-12-21 更新:添加@Subcomponent注解以及Lazy與Provider...
    fxzou閱讀 28,557評論 77 331
  • 幾個問題 看到Dagger2這個詞的時候目尖,相信很多人會有很多的疑問如下:Dagger2如何使用在例子中馒吴?Injec...
    codeHoward閱讀 7,029評論 4 10
  • 部分內(nèi)容參考自:[Android]使用Dagger 2依賴注入 - DI介紹(翻譯)[Android]使用Dagg...
    AItsuki閱讀 47,596評論 66 356
  • 幽靈不再故作深沉 赤裸裸地在雪地里跳舞 人們幾時才能卸下偽裝 壓不住的怒火 盡管向風傾訴 浮躁彌漫指尖 什么都經(jīng)不...
    陌上冷閱讀 191評論 0 1
  • 成長之路(二) 內(nèi)心小小的獨白 一直覺得信馬由韁的寫文章是一種發(fā)自內(nèi)心的舒暢,因為再也沒有人可以告訴我瑟曲,什么是可以...
    羅嫚閱讀 306評論 1 6