作者:Hancl | 来源:互联网 | 2023-01-20 10:27
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的使用。
2 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.