Dagger2是谷歌基于Square的Dagger基础上的二次开发,它移除了Dagger中所有反 射的使用,同时在构建对象图时使用@Component注解代替 Dagger中的ObjectGraph/Injector 的使用 ,从而让发者可以写出更简洁的代码 。Dagger2的编 译时注解使用 android-apt ,因此需要在build.gradle文件中引入依赖。
compile "com.google.dagger:dagger:2.8"
annotationProcessor "com.google.dagger:dagger-compiler:2.8"
由于继承自 Dagger ,因 此 ,Dagger2 的很多用法和Dagger一模一样,例如
@Inject:用来标记需要注入的构造器和属性。
a.用来标记构造器时,在需要创建这个累的实例时。Dagger会回去构造器所需要的参数并调用这个构造器进行实例化。
b.用来标志属性时,如果这个类没有同时对构造器进行注入,那么Dagger默认会使用这个类的五参数构造器进行实例化。
ps:需要注意的是,@Inject不支持对普通方法的注入,也不支持接口interface,第三方函数库中的类,在这种1情况下,我们可以使用@Provides注解,它用来标志函数,表示这个函数作为注入的提供者,同时函数名不重要,重要的是函数的返回值类型。所有被@Provides标志的函数都应该放在使用注解@Module标志的类定义中。
@singleton:在前面定义@Provides函数时,如果增加@Singleton注解,那么这个函数会一直返回相同的对象实例。
@Module:@Module用于标注提供依赖的类。你可能会有点困惑,上面不是提到用@Inject标记构造函数就 可以提供依赖了么,为什么还需要@Module?很多时候我们需要提供依赖的构造函数是第三方库的,我们没 法给它加上@Inject注解,又比如说提供以来的构造函数是带参数的,如果我们之所简单的使用@Inject标记 它,那 么他的参数又怎么来呢?@Module正是帮我们解决这些问题的。
@Provides:@Provides用于标注Module所标注的类中的方法,该方法在需要提供依赖时被调用,从而把预 先提供好的对象当做依赖给标注了@Inject的变量赋值;
@Component:@Component用于标注接口,是依赖需求方和依赖提供方之间的桥梁。被Component标注的接口在编译时会生成该接口的实现类(如果@Component标注的接口为CarComponent,则编译期生成的实现类为DaggerCarComponent),我们通过调用这个实现类的方法完成注入;
@Qulifier:作用和函数的重载很像。告诉Dagger依赖需求方 创建数据的时候使用哪个依赖提供方。Dagger2中,如果Module类中有多个@Provides标注的方法同时提供同一类型的依赖,IDE编译时在会报错,也就是说,Dagger2不知道该用哪个方法提供的依赖。可以通过@Qualifier来解决。
@Scope:@Scope同样用于自定义注解,我能可以通过@Scope自定义的注解来限定注解作用域,实现局部的单例;
默认的命名规范是:@Provides注解的函数名以provide作为前缀,@Module注解的类名以Module作为后缀。
项目地址: https://github.com/604982372/dagger2_mvp