Dagger2 進階(二)

@Qulifier 和@Named

在用Module的時候是根據返回類型來確定爲誰提供依賴的,當某個對象需要注入依賴時,Dagger2就會根據Module中標記了@Provide的方法的返回值來確定由誰爲這個變量提供實例。如果有兩個一樣的返回類型,Dagger2就會無法區分。我們把這種場景叫做依賴迷失,見名知意,Dagger這時候就不知道用誰來提供依賴,自然就迷失了。所以我們引入了@Qulifier這個東西,通過自定義Qulifier,可以告訴Dagger2去需找具體的依賴提供者。

  • 方法一:使用Qulifier

    定義兩個註解,@A和@B,他們都是用@Qulifiier標註的

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface A {
}

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface B {
}
 Student類
public class Student {
  private String name;

  public Student(String name){
    this.name=name;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}
Module
@Module
public class MainActivityModule {

  @Provides
  RestApiStore provideApiStore(){
    return new RestApiStore();
  }

  @A
  @Provides
  Student provideStudentA(){
    return new Student("A");
  }
  @B
  @Provides
  Student provideStudentB(){
    return new Student("B");
  }
}
在Activity中注入
  @A
  @Inject
  Student a;
  @B
  @Inject
  Student b;
  • 方法二:使用Named
    Teacher類
public class Student {
  private String name;

  public Student(String name){
    this.name=name;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

module中

 @Named("A")
  @Provides
  Teacher providerA(){
    return new Teacher("A");
  }
  @Named("B")
  @Provides
  Teacher providerB(){
    return new Teacher("B");
  }

在activity中注入

  @Named("A")
  @Inject
  Teacher ta;
  @Named("B")
  @Inject
  Teacher tb;

github地址:https://github.com/zhangyuesx215/Dagger2-MVP

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章