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的使用。

2Dagger2的使用:

@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<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.






更多相关文章

  1. 实现基于注解(Annotation)的数据库框架(一)反射的基本了解
  2. 【android】两个view共用同一个animation对象的问题
  3. 空对象引用错误:使用SQLite的Android Studio
  4. Android通过反射打造可以存储任何对象的万能SharedPreferences
  5. android通知适用于循环中的一个对象[重复]
  6. android 编译时注解
  7. android:使用网络通信技术从客户端直接获取服务端的对象数据
  8. 领域:更新外部对象的id
  9. Unity Android使用相机拍摄照片并在其上增加一个3D对象

随机推荐

  1. Android支持的媒体格式
  2. android仿京东商城例子
  3. 使用ContentProvider时出现SecurityExcep
  4. android快捷卸载第三方应用
  5. android socket客户端app
  6. Android——ScrollView
  7. android > styles
  8. android控件相对布局
  9. google map my demo
  10. 判断Android设备是否连接网络