四 Dagger2的@Qulifier和@Named注解

2019-07-01  本文已影响0人  天地玄黄

概述:我们已经知道,@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,我们编译一下。

image.png

报错了,提示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;
上一篇下一篇

猜你喜欢

热点阅读