Dagger2疑慮

1、@Singleton (可以用來表示全局單例) @Scope(可以用來表示局部單例)
  • 當(dāng)Component的Modules中有@Singleton標(biāo)記的Provide方法,當(dāng)前Component也必須用@Singleton標(biāo)記。由于Singleton也是被@Scope所標(biāo)記,所以同理被@Scope標(biāo)記的Provide方法,Component也需要被標(biāo)記。

  • @Component的dependencies與@Component自身的scope不能相同,即組件之間的scope不能相同.

  • @Singleton的組件不能依賴其他scope的組件,但是其他scope的組件可以依賴@Singleton組件

@Singleton實(shí)現(xiàn)全局單例的方式比較特殊,必須滿足以下幾個(gè)條件:
(1)全局單例AppComponent必須保證只被實(shí)例化一次。
(2)即使AppComponent只在Application中實(shí)例化一次,也得保證Module中的Provide方法被@Singleton標(biāo)記。同理,即使Module中的Provide方法與AppComponent都被@Singleton標(biāo)記,也得保證AppComponent只有一個(gè)實(shí)例。

最后網(wǎng)上很多博客講@Singleton并沒有創(chuàng)建單例的能力,我認(rèn)為這句話欠妥,因?yàn)榧词笰ppComponent只在Application中實(shí)例化一次,也得保證Module中的Provide方法被@Singleton標(biāo)記才能實(shí)現(xiàn)單例,否則client每次獲取依賴都是創(chuàng)建一個(gè)新的對(duì)象。
其次我認(rèn)為自定義@Scope的作用有兩點(diǎn):

第一:為了更好的管理Component與Module之間的組織方式,提高可讀性,能讓我們立馬就能區(qū)分哪些是全局單例,哪些是局部單例。

第二:被@Scope標(biāo)記的依賴與component的生命周期(不是整個(gè)應(yīng)用)關(guān)聯(lián)。可以參考下面文章。

參考:解鎖Dagger2使用姿勢(shì)(二) 之帶你理解@Scope
從Dagger2源碼角度理解Scope注解
詳解 Dagger2 的 @Scope 和 @Subcomponent

疑慮:自定義@Scope標(biāo)記后,client被銷毀后,@Scope生命周期如何結(jié)束???
Dagger2的@Scope的用法介紹 這篇文章最后解決了這個(gè)疑慮

2.Dagger2添加依賴,以及版本號(hào)
// Add Dagger dependencies
dependencies {
  compile 'com.google.dagger:dagger:2.x' // Dagger2 實(shí)際上是java中使用的
  annotationProcessor 'com.google.dagger:dagger-compiler:2.x' // 注解處理器(這個(gè)是必須要的)
}

If you're using classes in dagger.android you'll also want to include:

compile 'com.google.dagger:dagger-android:2.x' // Dagger2 Android包
// 如果使用支持包, 上面的Android包可以省略,支持包里面已經(jīng)包含了
compile 'com.google.dagger:dagger-android-support:2.x' //  Dagger2 Android 支持包,用于支持v4、v7下的控件
annotationProcessor 'com.google.dagger:dagger-android-processor:2.x'

2.x中的x表示多少?可以參考https://github.com/google/dagger/releases

注意添加以上Dagger2依賴會(huì)有個(gè)編譯錯(cuò)誤如圖:

Dagger2添加依賴編譯報(bào)錯(cuò)

解決方法:

    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
    exclude group: 'com.google.code.findbugs', module: 'jsr305' //添加這一行
})

網(wǎng)上關(guān)于Dagger2的博客一般都是按java中的使用方法,這樣是很不方便的,在Android中的使用可以參考
Android項(xiàng)目基本架構(gòu)(二) Dagger2
Dagger2 與 AndroidInjector

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容