本文閱讀需要五分鐘
本文閱讀需要Dagger2簡單使用的基礎(chǔ)
@Qualifier 英文含義限定詞,它的作用和函數(shù)的重載很像寸五。它告訴Dagger依賴需求方 創(chuàng)建數(shù)據(jù)的時候使用哪個依賴提供方。
我們將用一個例子說明
比如Theme包含一個themeName
public class Theme {
String themeName;
public Theme(String themeName) {
this.themeName = themeName;
}
}
我們需要提供兩個Theme傀履,provideDayTheme和provideNightTheme
@Module
public class ThemeModule {
@Provides
@ThemeDay
Theme provideDayTheme() {
return new Theme("day");
}
@Provides
@ThemeNight
Theme provideNightTheme() {
return new Theme("night");
}
}
我們在使用注入的時候
@Inject
Theme theme;
Dagger是用provideDayTheme幫我們創(chuàng)建還是使用provideNightTheme呢?這明顯是一個困局事秀。
@Qualifier就是幫我們解決這個困局惠呼。
自定義一個ThemeNight 的注解
@Qualifier
public @interface ThemeNight {
}
自定義一個ThemeDay 的注解
@Qualifier
public @interface ThemeDay {
}
注意這里以前沒有接觸過注解的同學(xué)滋早,可能會有些迷糊,我們之前用的注解都是在類考婴,方法贩虾,屬性上用的。這次我們的@Qualifier是用來給注解做注解的沥阱。對的沒錯缎罢,這個是@Qualifier就是用來自定義注解的。它的作用就是讓你自定義的注解可以完成依賴需求方 知道數(shù)據(jù)是哪個依賴提供方提供的。
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;又加了一個@ThemeDay的限定策精,Dagger就從ThemeModule 中去找是哪個@Provides提供者也加了@ThemeDay的限定舰始。
我們上篇文章寫過
@Module
Dagger2是怎么選擇依賴提供的呢,規(guī)則是這樣的:
步驟1:查找Module中是否存在創(chuàng)建該類的方法咽袜。
步驟2:若存在創(chuàng)建類方法丸卷,查看該方法是否存在參數(shù)
步驟2.1:若存在參數(shù),則按從步驟1開始依次初始化每個參數(shù)
步驟2.2:若不存在參數(shù)询刹,則直接初始化該類實例谜嫉,一次依賴注入到此結(jié)束
步驟3:若不存在創(chuàng)建類方法,則查找@Inject注解的構(gòu)造函數(shù)凹联,看構(gòu)造函數(shù)是否存在參數(shù)
步驟3.1:若存在參數(shù)沐兰,則從步驟1開始依次初始化每個參數(shù)
步驟3.2:若不存在參數(shù),則直接初始化該類實例蔽挠,一次依賴注入到此結(jié)束
這里就解釋了為什么Dagger2使用注入對象的時候為什么先從Module的@Provides中找住闯,然后再@Inject注解的構(gòu)造函數(shù),這個加載順序更加符合開發(fā)者對構(gòu)造新對象的需求順序澳淑。