Dagger2學(xué)習(xí)要點(diǎn)理解:
Qualifier(限定符,就是解決依賴注入迷失問(wèn)題的瘸味,即對(duì)獲取對(duì)象的篩選或限定);
Scope(作用域切端,其實(shí)只是起到提醒和管理的作用);
Singleton(單例寂祥,Scope的特殊衍生注解荐虐,也只是起到提醒和管理的作用);
- Qualifier創(chuàng)建的兩個(gè)不同的實(shí)例的使用舉例:
@Qualifier
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface PoetryQualifier {
String value() default "";
}
@Module
public class AModule {
@PoetryQualifier("A")
@AScope
@Provides
public Poetry getPoetry(){
return new Poetry("萬(wàn)物美好");
}
@PoetryQualifier("B")
@AScope
@Provides
public Poetry getOtherPoetry(){
return new Poetry("我在中間");
}
}
//在Activity中使用方式,匹配Module中同樣注解的實(shí)例
@PoetryQualifier("B")
@Inject
Poetry mPoetryB;
創(chuàng)建類實(shí)例有2種維度:
通過(guò)用Inject注解標(biāo)注的構(gòu)造函數(shù)來(lái)創(chuàng)建(以下簡(jiǎn)稱Inject維度)
通過(guò)工廠模式的Module來(lái)創(chuàng)建(以下簡(jiǎn)稱Module維度)
并且創(chuàng)建類實(shí)例級(jí)別Module維度要高于Inject維度丸凭。Scope注解福扬,可用來(lái)限定通過(guò)Module和Inject方式創(chuàng)建實(shí)例的生命周期能夠與目標(biāo)類的生命周期相同,其實(shí)就是起到一個(gè)提醒和管理的作用惜犀。
-
要保證ApplicationComponent只有一個(gè)實(shí)例铛碑,要求在app的Application中實(shí)例化ApplicationComponent。而Singleton本身是沒(méi)有創(chuàng)建單例的能力的虽界,只不過(guò)Singleton有以下作用:
代碼可讀性汽烦,即起到提醒作用,好讓程序猿更好的了解Module中創(chuàng)建的類實(shí)例是單例的莉御。
更好的管理ApplicationComponent和Module之間的關(guān)系撇吞,保證ApplicationComponent和Module是匹配的。若ApplicationComponent和Module的Scope是不一樣的礁叔,則在編譯時(shí)報(bào)錯(cuò)牍颈。
-
組織Component之間的關(guān)系:
依賴方式
一個(gè)Component是依賴于一個(gè)或多個(gè)Component,用dependencies屬性實(shí)現(xiàn)晴圾;包含方式
一個(gè)Component是包含一個(gè)或多個(gè)Component的颂砸,被包含的Component還可以繼續(xù)包含其他的Component,用SubComponent屬性實(shí)現(xiàn)死姚;繼承方式
官網(wǎng)未提到該方式人乓,其不是解決類實(shí)例共享的問(wèn)題,而是從更好的管理都毒、維護(hù)Component的角度色罚,把一些Component共有的方法抽象到一個(gè)父類中,然后子Component繼承账劲。
-
值得注意的是:
不管是依賴方式還是包含方式戳护,都必須要有Scope的衍生注解(自定義的Scope注解)標(biāo)注這些Component金抡,并且這些注解不能一樣,這樣即是為了體現(xiàn)出Component之間的組織方式不同(如:被依賴的Component使用Singleton表示Activity的生命周期腌且,而另一個(gè)Component則要使用其他 Scope的衍生注解來(lái)標(biāo)記)梗肝,其實(shí)這也是為了防止報(bào)錯(cuò)(我測(cè)試時(shí)報(bào)的錯(cuò)誤是這樣的:Error:(33, 12) 錯(cuò)誤: This @Singleton component cannot depend on scoped components:@Singleton com.cxtx.chefu.app.basemvp.AppComponent)。
-
使用包含方式時(shí)铺董,Component中可以不寫獲取該對(duì)象的方法巫击,@inject直接能從標(biāo)記@Provides的方法中找到所需的對(duì)象;而在使用依賴方式時(shí)精续,不能只靠Module中的@Provides標(biāo)識(shí)坝锰,還需要在Component中寫出要獲得該對(duì)象的方法,只有這樣該對(duì)象才能被@inject找到重付,否則也會(huì)報(bào)如下錯(cuò)誤:
Error:(12, 34) 錯(cuò)誤: 找不到符號(hào) 符號(hào): 類 DaggerAppComponent 位置: 程序包 com.cxtx.chefu.app.basemvp Error:(45, 8) 錯(cuò)誤: com.cxtx.chefu.app.basemvp.ServiceApi cannot be provided without an @Provides-annotated method. com.cxtx.chefu.app.basemvp.ServiceApi is injected at com.cxtx.chefu.app.home.enterprise_oil.manager.drivers.DriviersPresenter.<init>(serviceApi, …) com.cxtx.chefu.app.home.enterprise_oil.manager.drivers.DriviersPresenter is injected at com.cxtx.chefu.app.home.enterprise_oil.manager.drivers.EnterpriseDriversActivity.presenter com.cxtx.chefu.app.home.enterprise_oil.manager.drivers.EnterpriseDriversActivity is injected at com.cxtx.chefu.app.basemvp.ActivitiesComponent.inject(activity) 注意看這句話:Error:(45, 8) 錯(cuò)誤: com.cxtx.chefu.app.basemvp.ServiceApi cannot be provided without an @Provides-annotated method.
.