Dagger2的使用(1)

在一般情况下使用@Inject和@Component就能实现注入

但是在以父类为抽象类引用指向子类的时候,只用@Inject编译会报错

这时候需要用到@Module和@Provides注解了

1、与之前一样导依赖jar包。

2、创建 xxx实体类名+Module的Module类

Module中

@Module
public class PersonModule {
    @Provides
    public Person providePerson() {
        return new Student();
    }
}

Component中(需要指定modules)

@Component(modules = PersonModule.class)
public interface MainActivityComponent {
    void inject(MainActivity activity);
}

3、在多个Provides的情况下(要用到@Qualifier 来限定)

​ -@Qualifier用来定义注解

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface ParentPerson {}

​ -该注解用于区别不同的Provides (即抽象父类的不同子类)

@Module
public class PersonModule {
    @Provides
    @StudentPersonpublic Person providePerson() {
        return new Student();
    }
    @Provides
    @ParentPersonpublic Person provideParent() {
        return new Parent();
    }
}

​ -需要以该抽象类对象为传入对象的构造方法的 类的注入

@Module
public class ClassesModule {
    @Provides
    public ClassMates provideClassesMate(@StudentPerson  ② Person person) {
        return new ClassMates(person); 
    }
}

​ -最后Component中还要另外添加一个ClassesModule.class

@Component(modules = {PersonModule.class, ClassesModule.class})
public interface MainActivityComponent {
    void inject(MainActivity activity);
}

上面三个过程的代码的作用可以理解为:需要创建一个ClassMates类的对象,这个类的构造方法需要传入一个其他对象,那么这个其他对象也要通过依赖注入的方式,而这个传入的参数是一个父类的引用,其指向的子类类型有多种,这时候就涉及到多个不同的子类注入时的Provides的区分了,这里用的是@Qualifier生命一个注解,再用该注解在子类的Module中进行区分指定(①),那么在ClassMates类注入用的Module中传入参数就可以用该自定义注解来进行区分(②)。

备注:

1、@Inject注解有三个作用:写在实体类的构造方法上 用于 指定改方法可用于得到该对象;写在需要被注入类的成员变量上 用于 将对象注入该成员变量;写在需要被注入类的方法上,如setXXX()方法等,这样的方法一般在构造方法执行后执行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值