Dagger2 獨(dú)家解讀

1、Dagger2是干嘛的探颈?

?Dagger2是用于依賴解耦的

2熟丸、要了解Dagger2他是怎么解耦的?

他是靠注解生成器伪节,通過各種注解比如:@Component 光羞、@Module绩鸣、@Provides、@Named纱兑、@Singleton 等等

在AS? Build階段呀闻,使用?com.google.dagger:dagger-compiler:2.11 注解生成器,按照已經(jīng)實(shí)現(xiàn)好的代碼潜慎,對(duì)我們項(xiàng)目的整個(gè)代碼進(jìn)行掃描注解捡多,然后獲取到帶有相應(yīng)注解的類,然后對(duì)帶有注解的類重新生成一份代碼

3铐炫、那么這個(gè)代碼怎么生成呢垒手?

javapoet? 就是這個(gè)代碼生成工具,這個(gè)工具應(yīng)該算是和注解生成器一起使用的工具了倒信,就是這個(gè)在生成各種我們需要的源代碼淫奔。

那么生成的代碼分為哪幾種呢?

a堤结、Dagger***Component? implements ***Component? ? ? ? ? ? ? ? Dagger的中間橋梁? 實(shí)現(xiàn)自我們寫的 ***Component(這下應(yīng)該知道為啥? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Component都是接口了吧)? 例如:DaggerAppComponent implements ????????????????????????????????????????????????????????????????????????????????????????????????????????AppComponent

b、***Module_Provide***Factory? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Dagger創(chuàng)建實(shí)例方式一(通過添加了@Module的類)鸭丛,前面的*表示哪個(gè)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Module竞穷,后面的*代表生成的哪個(gè)實(shí)例 例如? ?:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?HttpModule_ProvideOkHttpBuilderFactory

c、***_Factory?????????????????????????????????????????????????????????????????????????????? ?Dagger創(chuàng)建實(shí)例方式二(通過在構(gòu)造函數(shù)上添加@Inject)鳞溉,*表示了創(chuàng)建 ????????????????????????????????????????????????????????????????????????????????????????????????????????的實(shí)例是哪個(gè)類的

d瘾带、***_MembersInjector? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Component添加的 注入類 即在我們自己創(chuàng)建的Component里面得 返回值? ?????????????????????????????????????????????????????????????????????????????????????????????????????????為void 的方法 例如:void inject(MainActivity activity);

生成的代碼大致就是這幾類

其中 a屬于中間件,連接b熟菲、c? 與 d的

b看政、c屬于實(shí)例創(chuàng)建

d 屬于實(shí)例獲取??那么如果想要獲取實(shí)例抄罕,只需要在對(duì)應(yīng)的類中 初始化Dagger***Component的注入方法(該方法需要在自己寫的***Component中自己寫出來??例如:void inject(MainActivity activity);)允蚣,然后在類里面使用@Inject即可

完整的如:

@Component( modules = ActivityModule.class)

public interface ActivityComponent {

void inject(MainActivity activity);

public?class? MainActivity?extends AppCompatActivity{

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

????super.onCreate(savedInstanceState);

????this.setContentView(this.getLayout());

????DaggerActivityComponent.builder()

????.build().inject(this)

????}

}

4、當(dāng)我們使用@Inject 獲取實(shí)例時(shí)呆贿,為啥不能獲取類型相同的實(shí)例嚷兔?

我覺得這個(gè)就好比,同一個(gè)對(duì)象不能創(chuàng)建 參數(shù)類型相同的構(gòu)造函數(shù)一樣做入。

那么如何解決這個(gè)問題呢冒晰?

1、在@Module的類的方法上添加 @Named("one") 注解 進(jìn)行區(qū)分

2竟块、使用@Qualifier注解 壶运,創(chuàng)建一個(gè)注解,并使用@Qualifier 對(duì)其注解? ?比如 @One? ?將這個(gè)注解添加在 @Provides 的方法上

例如:

@Qualifier

@Documented

@Retention(RUNTIME)

public @interface One{

}

在使用時(shí)浪秘,在@Inject注解上面添加 @One? 即可獲取到對(duì)應(yīng)的實(shí)例

上述兩種方法就好比:我們創(chuàng)建相同參數(shù)的構(gòu)造函數(shù)時(shí)蒋情,添加一個(gè)type參數(shù)埠况,用于區(qū)分不同的對(duì)象

5、為什么我使用@Singleton 注解時(shí)恕出,在不同的Activity使用時(shí)询枚,是不相同的單例對(duì)象?

在Dagger2看來? @Singleton 是屬于Application單例還是Activity單例呢? 其實(shí)這個(gè)和Component的創(chuàng)建和銷毀有關(guān)浙巫,如果在Application創(chuàng)建和銷毀那么他就是進(jìn)程級(jí)別的全局單例金蜀,如果是Activity創(chuàng)建和銷毀的,那么他就是頁(yè)面級(jí)別局部單例的畴。

還記得我們要在某一個(gè)Activity使用Dagger2嗎渊抄?? 是不是需要先初始化,然后再使用丧裁? 雖然我們看不到銷毀护桦,但是當(dāng)頁(yè)面關(guān)閉掉后,GC會(huì)自動(dòng)幫我們銷毀掉煎娇,所以我們?cè)贏ctivity使用的基本都是頁(yè)面級(jí)別的局部單例二庵。

6、我們?cè)趺磩?chuàng)建全局單例呢缓呛?

Dagger2也想到了這個(gè)問題催享,那么 Component也就出現(xiàn)了一個(gè)繼承的關(guān)系,還有 一個(gè)SubComponent的概念哟绊。即 父Component的全局范圍一定要大于子Component因妙,我們可以寫一個(gè)AppComponent (父)和 ActivityComponent(子) AppComponent在Application中創(chuàng)建(所有需要全局單里的對(duì)象寫在該Component的Module類里面即可),ActivityComponent在具體的Activity(所有Activity要使用的對(duì)象寫在該Component的Module類里面即可)頁(yè)面創(chuàng)建即可票髓。

在此期間攀涵,我們可以使用@Scope注解 來添加新的注解? 比如 @ActivityScope? 用于標(biāo)記我們子Component,這個(gè)@ActivityScope是標(biāo)記我們的作用域洽沟,其實(shí)用處就是告知父Component? 你的子Component的作用域小于你

注意:ActivityComponent創(chuàng)建時(shí)以故,記得傳入全局的Appcomponent 這樣我們就可以使用全局的單例對(duì)象了

總結(jié):

自此Dagger2的解讀就到這里,其實(shí)Dagger2一直圍繞的都是 創(chuàng)建對(duì)象-使用對(duì)象這個(gè)主線來操作的裆操。 因?yàn)樗暮诵氖墙怦罹莸拢敲此仨氁幸粋€(gè)中間件,將創(chuàng)建與使用對(duì)象結(jié)合起來跷车,那么 中間件一定要能生成對(duì)象? 也一定要能將對(duì)象注入到具體的類中棘利,而且中間件也必須是獨(dú)立的。

實(shí)現(xiàn)了中間件功能之后朽缴,就得要擴(kuò)展善玫,比如要是有多個(gè)相同的對(duì)象不同內(nèi)容的實(shí)例怎么解決,要是有多個(gè)不同的頁(yè)面怎么注入,要是想注入到不同頁(yè)面的對(duì)象都是單例的怎么解決茅郎? 要是想復(fù)用其他中間件的實(shí)例怎么解決蜗元?

為什么要這些擴(kuò)展? 因?yàn)椴粩U(kuò)展就沒有商用的價(jià)值系冗,后面還有java向的擴(kuò)展奕扣,android向的擴(kuò)展。那么Dagger2也有對(duì)應(yīng)的依賴掌敬,我想基于基本功能已經(jīng)實(shí)現(xiàn)惯豆,那么偏向android的擴(kuò)展應(yīng)該是如何簡(jiǎn)化使用的吧,或者更加細(xì)粒度的功能奔害。對(duì)于這些楷兽,如果不是真正的要完全使用他的話,基本看到這里就已經(jīng)足夠我們使用了华临。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芯杀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子雅潭,更是在濱河造成了極大的恐慌揭厚,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扶供,死亡現(xiàn)場(chǎng)離奇詭異筛圆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)诚欠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漾岳,“玉大人轰绵,你說我怎么就攤上這事∧峋#” “怎么了左腔?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捅儒。 經(jīng)常有香客問我液样,道長(zhǎng),這世上最難降的妖魔是什么巧还? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任鞭莽,我火速辦了婚禮,結(jié)果婚禮上麸祷,老公的妹妹穿的比我還像新娘澎怒。我一直安慰自己,他們只是感情好阶牍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布喷面。 她就那樣靜靜地躺著星瘾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惧辈。 梳的紋絲不亂的頭發(fā)上琳状,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音盒齿,去河邊找鬼念逞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛县昂,可吹牛的內(nèi)容都是我干的坏晦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼槽驶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼呼畸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起待讳,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤芒澜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后创淡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痴晦,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年琳彩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了誊酌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡露乏,死狀恐怖碧浊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘟仿,我是刑警寧澤箱锐,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站劳较,受9級(jí)特大地震影響驹止,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜观蜗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一臊恋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧墓捻,春花似錦捞镰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)践樱。三九已至,卻和暖如春凸丸,著一層夾襖步出監(jiān)牢的瞬間拷邢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工屎慢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞭稼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓腻惠,卻偏偏與公主長(zhǎng)得像环肘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子集灌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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