美文网首页
四 Dagger2的@Qulifier和@Named注解

四 Dagger2的@Qulifier和@Named注解

作者: 天地玄黄 | 来源:发表于2019-07-01 11:38 被阅读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;
    

    相关文章

      网友评论

          本文标题:四 Dagger2的@Qulifier和@Named注解

          本文链接:https://www.haomeiwen.com/subject/ssjecctx.html