android studio Dagger2的使用(环境搭建和helloword)
16lz
2021-01-22
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在 MainActivity中声明 Dagger_data1的对象,
public 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在这里是MainActivityOK,对象创建完毕,我们直接使用对象里面的方法就可以data1.getA();结果出来是10.
更多相关文章
- 实现基于注解(Annotation)的数据库框架(一)反射的基本了解
- 【android】两个view共用同一个animation对象的问题
- 空对象引用错误:使用SQLite的Android Studio
- Android通过反射打造可以存储任何对象的万能SharedPreferences
- android通知适用于循环中的一个对象[重复]
- android 编译时注解
- android:使用网络通信技术从客户端直接获取服务端的对象数据
- 领域:更新外部对象的id
- Unity Android使用相机拍摄照片并在其上增加一个3D对象