概述:我们已经知道,@Module注解提供需要的实例对象。但是如果是同一类型的对象,不同的@Provides方法,Dagger2会选择哪个?
举个例子:provideStudent() 和 provideNewStudent(),返回的都是Student对象。同时写在Module中,会出现什么问题?
写个例子测试下:
@Module
public class MainModule {
@Provides
static Student provideStudent() {
return new Student();
}
@Provides
static Student provideNewStudent() {
return new Student();
}
@Provides
static Teacher provideTeacher() {
return new Teacher();
}
}
这里有两个方法同时返回了Student,我们编译一下。
报错了,提示Student重复了。那么怎么解决这个问题?
1 @Qulifier
这时候就需要我们提供一个别名,让 目标类成员变量的类型 和 创建方法的返回类型 形成一对一的关系,一般来说,使用@Qulifier是比较标准的方式。
1.1 定义一个接口学生A和学生B,分别代表两个学生,然后用@Qualifier修饰
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface StudentA{}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface StudentB{}
然后分别在Module加上对应注解
@Provides
@StudentA
static Student provideStudent() {
return new Student();
}
@Provides
@StudentB
static Student provideNewStudent() {
return new Student();
}
最后在引用的位置也加上注解,形成一对一的关系
public class MainActivity extends AppCompatActivity {
@Inject
@StudentA
Student student;
@Inject
@StudentB
Student student1;
这样就可以保证,即使是返回相同的类型,也能保证一一对应的关系。
2 @Named注解
除了上面的@Qualifier注解,还可以用@Named注解达到同样的效果
@Provides
@Named("StudentA")
static Student provideStudent() {
return new Student();
}
@Provides
@Named("StudentB")
static Student provideNewStudent() {
return new Student();
}
使用的时候
@Inject
@Named("StudentA")
Student student;
@Inject
@Named("StudentB")
Student student1;