@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;