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