Dagger2 @Qualifier

本文閱讀需要五分鐘
本文閱讀需要Dagger2簡單使用的基礎(chǔ)
@Qualifier 英文含義限定詞,它的作用和函數(shù)的重載很像。它告訴Dagger依賴需求方 創(chuàng)建數(shù)據(jù)的時(shí)候使用哪個(gè)依賴提供方。
我們將用一個(gè)例子說明
比如Theme包含一個(gè)themeName

public class Theme {
    String themeName;

    public Theme(String themeName) {
        this.themeName = themeName;
    }
}

我們需要提供兩個(gè)Theme,provideDayTheme和provideNightTheme

@Module
public class ThemeModule {
    @Provides
    @ThemeDay
    Theme provideDayTheme() {
        return new Theme("day");
    }

    @Provides
    @ThemeNight
    Theme provideNightTheme() {
        return new Theme("night");
    }
}

我們?cè)谑褂米⑷氲臅r(shí)候

 @Inject 
 Theme theme;

Dagger是用provideDayTheme幫我們創(chuàng)建還是使用provideNightTheme呢?這明顯是一個(gè)困局。
@Qualifier就是幫我們解決這個(gè)困局。
自定義一個(gè)ThemeNight 的注解

@Qualifier
public @interface ThemeNight {

}

自定義一個(gè)ThemeDay 的注解

@Qualifier
public @interface ThemeDay {
}

注意這里以前沒有接觸過注解的同學(xué),可能會(huì)有些迷糊,我們之前用的注解都是在類,方法,屬性上用的。這次我們的@Qualifier是用來給注解做注解的。對(duì)的沒錯(cuò),這個(gè)是@Qualifier就是用來自定義注解的。它的作用就是讓你自定義的注解可以完成依賴需求方 知道數(shù)據(jù)是哪個(gè)依賴提供方提供的。

public class ThemeTest {
    @Inject
    @ThemeDay
    Theme dayTheme;
    @Inject
    @ThemeNight
    Theme nightTheme;

    public static void main(String[] arg) {
        ThemeTest themeTest = new ThemeTest();
        DaggerThemeComponent.create().inject(themeTest);
        System.out.println(themeTest.dayTheme.themeName);
        System.out.println(themeTest.nightTheme.themeName);
    }
}

在我們使用@Inject去注入 Theme dayTheme;又加了一個(gè)@ThemeDay的限定,Dagger就從ThemeModule 中去找是哪個(gè)@Provides提供者也加了@ThemeDay的限定。
我們上篇文章寫過
@Module
Dagger2是怎么選擇依賴提供的呢,規(guī)則是這樣的:

步驟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é)束

這里就解釋了為什么Dagger2使用注入對(duì)象的時(shí)候?yàn)槭裁聪葟腗odule的@Provides中找,然后再@Inject注解的構(gòu)造函數(shù),這個(gè)加載順序更加符合開發(fā)者對(duì)構(gòu)造新對(duì)象的需求順序。

最后編輯于
?著作權(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)容