四Dagger2的@Qulifier和@Named注解
概述:我们已经知道,@Module注解提供需要的实例对象。但是如果是同⼀类型的对象,不同的@Provides⽅法,Dagger2会选择哪个?
举个例⼦:provideStudent()和provideNewStudent(),返回的都是Student对象。同时写在Module中,会出现什么问题?
写个例⼦测试下:
@Module
publicclassMainModule{
@Provides
staticStudentprovideStudent(){
returnnewStudent();
}
@Provides
staticStudentprovideNewStudent(){
returnnewStudent();
}
@Provides
staticTeacherprovideTeacher(){
returnnewTeacher();
}
}
这⾥有两个⽅法同时返回了Student,我们编译⼀下。
报错了,提⽰Student重复了。那么怎么解决这个问题?
1@Qulifier
这时候就需要我们提供⼀个别名,让⽬标类成员变量的类型和创建⽅法的返回类型形成⼀对⼀的关系,⼀般来说,使⽤@Qulifier是⽐较标准的
⽅式。
1.1定义⼀个接⼝学⽣A和学⽣B,分别代表两个学⽣,然后⽤@Qualifier修饰
@Qualifier
@Retention(E)
public@interfaceStudentA{}
@Qualifier
@Retention(E)
public@interfaceStudentB{}
然后分别在Module加上对应注解
@Provides
@StudentA
staticStudentprovideStudent(){
returnnewStudent();
}
@Provides
@StudentB
staticStudentprovideNewStudent(){
returnnewStudent();
}
最后在引⽤的位置也加上注解,形成⼀对⼀的关系
publicclassMainActivityextendsAppCompatActivity{
@Inject
@StudentA
Studentstudent;
@Inject
@StudentB
Studentstudent1;
这样就可以保证,即使是返回相同的类型,也能保证⼀⼀对应的关系。
2@Named注解
除了上⾯的@Qualifier注解,还可以⽤@Named注解达到同样的效果
@Provides
@Named("StudentA")
staticStudentprovideStudent(){
returnnewStudent();
}
@Provides
@Named("StudentB")
staticStudentprovideNewStudent(){
returnnewStudent();
}
使⽤的时候
@Inject
@Named("StudentA")
Studentstudent;
@Inject
@Named("StudentB")
Studentstudent1;
本文发布于:2022-12-28 11:29:29,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/46377.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |