热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

androidstudioDagger2的使用(环境搭建和helloword)

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

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的类。该类有一成员变量inta=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 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.







推荐阅读
author-avatar
Hancl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有