android studio Dagger2的使用(环境搭建和helloword)

Dagger2是一款使用在Java和Android上的依赖注入的一个类库,目前Dagger有两个分支,一个由Square维护,一个为Google在前者的基础上开出的分支,即Dagger2

一般情况下,我们创建一个对象的时候都是采用new的形式,这样就会导致在代码多起来的时候,你不知道对象在哪里被创建,Dagger2就是为了方便管理这些对象。

1 Dagger2环境的搭建:

Dagger2的环境搭建很简单,在studio的工程的build.gradle下添加:

buildscript {
 ......
 dependencies {
     ......
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
 }
}
在module的 build.gradle添加:

apply plugin: 'com.neenbedankt.android-apt'
......
dependencies {
 ......
 compile 'com.google.dagger:dagger:2.5'
 apt "com.google.dagger:dagger-compiler:2.5"
 provided 'javax.annotation:javax.annotation-api:1.2'
}
这样, Dagger2的环境就搭建好了,下面我们来实现Dagger2的使用。

Dagger2的使用:

@Inject注解

该注解用来标记需要自动创建实例的类,哪个类需要初始化,就在哪个类的构造方法前面加上这个注解,然后再到该类的对象的前面也加上这个注解,在这里,我们创建一个Dagger_data1的类。该类有一成员变量int a=10;重写该类的构造方法,并在其上面添加@Inject,

@Inject
public Dagger_data1(){

}
MainActivity中声明 Dagger_data1的对象,

@Inject
Dagger_data1 data1;
此时编译的话,是无法正常运行的,@Inject并不能真正的创建对象,因此,我们还需要一个连接器去把
MainActivity中的对象和Dagger_data1连接起来,那就是@Component

@Component:刚说了Component是一个连接器,他通过查找目标类中用Inject注解标注的对象(本例子的对象在MainActivity中),查找到相应的对象后,接着查找该对象所在的类对应的用Inject标注的构造函数(这时候就发生联系了),剩下的工作就是初始化该变量的实例并把实例进行赋值。

创建一个 Component1接口,该接口使用 @Component注解标记,注意,该接口必须有一个或者更多的方法,而且该方法的命名满足provision或者members-injection规则,这里我们使用的是members-injection,
public void inject(MainActivity activity);
注意,该方法传进来的参数一定要和对象所在的上下文环境对应,本例子的对象是在MainActivity,参数就是
MainActivity,写到这里,连接器的方法我们就写完了,接下来编译,编译完成后Dagger2会生成一个类,这个类是我们初始化对象所用到类,该类的命名服从Dagger+连接器名称的规则,该类源码如下:
public final class DaggerComponent1 implements Component1 {
  private MembersInjector<MainActivity> mainActivityMembersInjector;

  private DaggerComponent1(Builder builder) {
    assert builder != null;
    initialize(builder);
  }

  public static Builder builder() {
    return new Builder();
  }

  public static Component1 create() {
    return builder().build();
  }

  @SuppressWarnings("unchecked")
  private void initialize(final Builder builder) {

    this.mainActivityMembersInjector =
        MainActivity_MembersInjector.create(Dagger_data1_Factory.create());
  }

  @Override
  public void inject(MainActivity activity) {
    mainActivityMembersInjector.injectMembers(activity);
  }

  public static final class Builder {
    private Builder() {}

    public Component1 build() {
      return new DaggerComponent1(this);
    }
  }
}
这样,我们就可以通过该类来创建我们需要创建的对象了
DaggerComponent1.builder().build().inject(this);//this在这里是MainActivity

OK,对象创建完毕,我们直接使用对象里面的方法就可以data1.getA();
结果出来是10.







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值