使用前的配置
在Module级的gradle文件中加入:
dependencies:
apt 'com.google.dagger:dagger-compiler:2.0' compile 'com.google.dagger:dagger:2.0' provided 'org.glassfish:javax.annotation:10.0-b28'在开头:
apply plugin: 'com.neenbedankt.android-apt'在app级的gradle中:
dependencies:
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
4个基本标签
- @Inject Inject主要有两个作用,一个是使用在构造函数上,通过标记构造函数让Dagger2来使用(Dagger2通过Inject标记可以在需要这个类实例的时候来找到这个构造函数并把相关实例new出来)从而提供依赖,另一个作用就是标记在需要依赖的变量让Dagger2为其提供依赖。
- @Provide 用Provide来标注一个方法,该方法可以在需要提供依赖时被调用,从而把预先提供好的对象当做依赖给标注了@Injection的变量赋值。provide主要用于标注Module里的方法
- @Module 用Module标注的类是专门用来提供依赖的。有的人可能有些疑惑,看了上面的@Inject,需要在构造函数上标记才能提供依赖,那么如果我们需要提供的类构造函数无法修改怎么办,比如一些jar包里的类,我们无法修改源码。这时候就需要使用Module了。Module可以给不能修改源码的类提供依赖,当然,能用Inject标注的通过Module也可以提供依赖
- @Component Component一般用来标注接口,被标注了Component的接口在编译时会产生相应的类的实例来作为提供依赖方和需要依赖方之间的桥梁,把相关依赖注入到其中。
不使用@Module标签的方法:
1,在使用的activity中的对象(比如Student类)声明上加上@Inject标签
2,在要注入的对象(比如Student类里的构造方法)的构造方法上加入@Inject标签
3,创建一个接口比如叫做AppComponent,在这个接口上加上@Component注解,在这个接口中声明对应要注入类的抽象方法,比如injectStudent(Activity activity),注意这里的activity必须要传入当前使用的activity才行,比如我在MainActivity中要注入Student,这里方法参数就写上MainActivity activity。
4,重新Rebuild一下项目,在MainActivity中:
DaggerAppComponent.builder().build().injectStudent(this);这里DaggerAppComponent是在 Rebuild后自动生成的类,injectStudent(this)是我们在接口中声明的方法
这样,Student就实例化完成了,可以直接调用该类对象的方法
使用@Module标签:(@Module标签是用来在为第三方的类提供依赖注入的情况下使用的,这样的类大多只有jar,没有源码,就不能在它们的构造方法上加@Inject了,所以要用到@Moudule)
1,在使用的activity中的对象(比如Student类)声明上加上@Inject标签
2,创建AppComponent,声明注入的抽象方法,类上添加@Component标签
3,创建MyMoudle类,在类上声明@Moudle标签,加入对应的注入方法比如public Student provideStudent(),在方法上声明@Provides标签
4,在AppComponent中的@Component后面加入(modules = MyMoudle.class)
5,在用到的Acitivty中,Rebuild后,DaggerMyComponent.builder().myMoudle(new MyMoudle).builde().injectStudent();
其中myMoudle()方法对应声明的@Moudle的类的名字,不是固定的
这样就完成了使用@Moudle标签方法来完成注解,这种方式不用再对应的Studnet的构造方法上加上@Infect,只要在使用它的Activity上的声明Studnet对象引用的地方加上@Inject就行了