Dagger2系列之入門

Dagger的官方介紹是這樣的:

Dagger is a fully static, compile-time dependency injection framework for both Java and Android. It is an adaptation of an earlier version created by Square and now maintained by Google.

Dagger aims to address many of the development and performance issues that have plagued reflection-based solutions.

主要意思是說

Dagger是Android和Java下的一個(gè)完全靜態(tài)的,編譯時(shí)依賴注入框架。它解決了有發(fā)射帶來的開發(fā)和性能上的問題苏携。

對(duì)于使用DaggerHelloWorld例子這里不做說明,因?yàn)榫W(wǎng)上已經(jīng)太多了链嘀,關(guān)鍵是你看了,甚至自己抄過一遍之后档玻,發(fā)現(xiàn)自己對(duì)于Dagger的認(rèn)識(shí)和理解還是云里霧里怀泊。Dagger是很犀利,但它還是有一定的學(xué)習(xí)曲線的误趴,類似于RxJava/RxAndroid霹琼。

這里首先大致介紹一下它的用法,整體上根據(jù)官方文檔來凉当,外加一點(diǎn)的客觀評(píng)論或者想法:

聲明依賴
  • 在構(gòu)造函數(shù)上面添加@Inject注解枣申,當(dāng)需要一個(gè)新的實(shí)例的時(shí)候,Dagger就會(huì)去獲取必要的參數(shù)然后執(zhí)行這個(gè)構(gòu)造函數(shù)看杭。至于怎么去獲取必要的參數(shù)忠藤,后面會(huì)介紹。
  • 同時(shí)@Inject也可以直接注解到字段里面楼雹。
    注意的一點(diǎn)是模孩,大部分情況下Dagger是注解在構(gòu)造函數(shù)或者字段尖阔,但是Dagger其實(shí)也支持方法的注入。
滿足依賴關(guān)系

大部分情況下榨咐,@Inject就可以解決了依賴注解問題介却,但是有些情況下它是做不到依賴注解注解的,比如

  • 接口不能被構(gòu)造
  • 第三方類庫不能被注解块茁,因?yàn)榈谌筋悗斓拇a不受你控制齿坷。
  • 可配置的對(duì)象必須要被配置。( 這個(gè)其實(shí)我也不是很明白:( )

以上這種情況就@inject就不滿足或者不合適了数焊,這個(gè)時(shí)候就需要用@provides這個(gè)注解來滿足這一類需求永淌,注意所有的@Provides方法必須屬于一個(gè)module

構(gòu)建圖

@Inject@Provides注解的類組成了一幅類的圖,通過他們之間的依賴關(guān)系進(jìn)行鏈接佩耳。通過@Component注解這樣一個(gè)接口類遂蛀,并且傳遞module類型給module參數(shù),Dagger 2然后就會(huì)根據(jù)約定生成方法的具體實(shí)現(xiàn)蚕愤。這個(gè)生成的類名就是以Dagger開頭,通過builder()方法來實(shí)現(xiàn)和使用反悔的builder饺蚊,然后通過它的build()方法來獲取一個(gè)實(shí)例萍诱。

如果一個(gè)module的權(quán)限訪問值沒有被設(shè)置,那么是可以dagger會(huì)自動(dòng)幫我們加上污呼。如果所有的依賴可以不依賴于用戶創(chuàng)建的實(shí)例裕坊,也就是說注解的參數(shù)里面,沒有module這個(gè)值燕酷,那么dagger會(huì)生成一個(gè)create()方法直接替換builder籍凝。對(duì)于這點(diǎn)舉個(gè)例子:

聲明一個(gè)interface叫做TestComponent如下,并且添加@Component注解苗缩,然后重新編譯生成DaggerTestComponent

@Component
public interface TestComponent {}

那么生成的DaggerTestComponent為:

public final class DaggerTestComponent implements TestComponent {                           private DaggerTestComponent(Builder builder) {    
        assert builder != null; 
    }  
    public static Builder builder() {    
        return new Builder();  
    }  
    public static TestComponent create() {    
        return builder().build();  
    }  
    public static final class Builder {    
        private Builder() {
        }    
        public TestComponent build() {      
                return new DaggerTestComponent(this);    
        }  
    }
}

從代碼就可以看出饵蒂,直接通過create就可以創(chuàng)建出一個(gè)TestComponent實(shí)例

總結(jié):

關(guān)于Dagger2是如何工作的,我自己的理解是這樣的:
在需要依賴注解的地方添加一個(gè)@Inject:
聲明變量的地方或者想被依賴注解的類的構(gòu)造函數(shù)

聲明一個(gè)Component
Component主要是綁定這個(gè)module

然后聲明一個(gè)Module:
Module主要是用來提供一些provider的方法酱讶,也就是只有一些返回值的方法退盯,其中方法名字隨便定義,但對(duì)于返回值這個(gè)要注意泻肯,因?yàn)檫@個(gè)是要提供給@Inject對(duì)象, 因此需要注意的一點(diǎn)是渊迁,Module里面的優(yōu)先級(jí)高于注解過的構(gòu)造方法

  • 步驟1:查找Module中是否存在創(chuàng)建該類的方法。
  • 步驟2:若存在創(chuàng)建類方法灶挟,查看該方法是否存在參數(shù)
    • 步驟2.1:若存在參數(shù)琉朽,則按從步驟1開始依次初始化每個(gè)參數(shù)
      步驟2.2:若不存在參數(shù),則直接初始化該類實(shí)例稚铣,一次依賴注入到此結(jié)束
    • 步驟3:若不存在創(chuàng)建類方法箱叁,則查找Inject注解的構(gòu)造函數(shù)墅垮,看構(gòu)造函數(shù)是否存在參數(shù)
  • 步驟3.1:若存在參數(shù),則從步驟1開始依次初始化每個(gè)參數(shù)
  • 步驟3.2:若不存在參數(shù)蝌蹂,則直接初始化該類實(shí)例噩斟,一次依賴注入到此結(jié)束
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市孤个,隨后出現(xiàn)的幾起案子剃允,更是在濱河造成了極大的恐慌,老刑警劉巖齐鲤,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斥废,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡给郊,警方通過查閱死者的電腦和手機(jī)牡肉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淆九,“玉大人统锤,你說我怎么就攤上這事√棵恚” “怎么了饲窿?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)焕蹄。 經(jīng)常有香客問我逾雄,道長(zhǎng),這世上最難降的妖魔是什么腻脏? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任鸦泳,我火速辦了婚禮,結(jié)果婚禮上永品,老公的妹妹穿的比我還像新娘做鹰。我一直安慰自己,他們只是感情好鼎姐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布誊垢。 她就那樣靜靜地躺著,像睡著了一般症见。 火紅的嫁衣襯著肌膚如雪喂走。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天谋作,我揣著相機(jī)與錄音芋肠,去河邊找鬼。 笑死遵蚜,一個(gè)胖子當(dāng)著我的面吹牛帖池,可吹牛的內(nèi)容都是我干的奈惑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼睡汹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼肴甸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起囚巴,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤原在,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后彤叉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庶柿,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年秽浇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浮庐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柬焕,死狀恐怖审残,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斑举,我是刑警寧澤搅轿,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站懂昂,受9級(jí)特大地震影響介时,放射性物質(zhì)發(fā)生泄漏没宾。R本人自食惡果不足惜凌彬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望循衰。 院中可真熱鬧铲敛,春花似錦、人聲如沸会钝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迁酸。三九已至先鱼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奸鬓,已是汗流浹背焙畔。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留串远,地道東北人宏多。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓儿惫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伸但。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肾请,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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