参考:
理解dagger2
- www.jianshu.com/p/cd2c1c9f6…
- www.jianshu.com/p/92f793e76…
- juejin.cn/post/684490…
- www.jianshu.com/p/72b572ff0…
- www.jianshu.com/p/626b2087e…
- www.jianshu.com/p/92f793e76…
- www.jianshu
关于java 注解
优势
性能:它使用的预编译期间生成代码来完成依赖注入,而不是用的反射。大家知道反射对手机应用开发影响是比较大的,因为反射是在程序运行时加载类来进行处理所以会比较耗时,而手机硬件资源有限,所以相对来说会对性能产生一定的影响。 Dagger2的注解框架采用的是apt代码自动生成技术,注解停留在编译阶段,所以说不影响性能。
常用注解
- @Inject
- @Component
- @Module
- @Provides
- @SubComponent
- @SingleTon
- @Named
- @Qualifier
- @Scope......
注解说明
- @Inject Inject主要有两个作用,一个是使用在构造函数上,通过标记构造函数让Dagger2来使用(Dagger2通过Inject标记可以在需要这个类实例的时候来找到这个构造函数并把相关实例new出来)从而提供依赖,另一个作用就是标记在需要依赖的变量让Dagger2为其提供依赖。
class A{
@Inject
B b;
}
class B{
@Inject
B(){
}
}
- @Component Component一般用来标注接口,Component需要引用到目标类的实例,Component会查找目标类中用 ++Inject++ 注解标注的属性,查找到相应的属性后会接着查找该属性对应的用Inject标注的构造函数(这时候就发生联系了),剩下的工作就是初始化该属性的实例并把实例进行赋值。因此我们也可以给Component叫另外一个名字注入器(Injector)
小结下
目标类想要初始化自己依赖的其他类:
用Inject注解标注目标类中其他类 用Inject注解标注其他类的构造函数 若其他类还依赖于其他的类,则重复进行上面2个步骤 调用Component(注入器)的injectXXX(Object)方法开始注入(injectXXX方法名字是官方推荐的名字,以inject开始)
build之后会生成一个以dagger开头mainComponent结尾的类。
Component现在是一个注入器,就像注射器一样,Component会把目标类依赖的实例注入到目标类中,来初始化目标类中的依赖。
-
@Module 用Module标注的类是专门用来提供依赖的。有的人可能有些疑惑,看了上面的@Inject,需要在构造函数上标记才能提供依赖,那么如果我们需要提供的类构造函数无法修改怎么办,比如一些jar包里的类,我们无法修改源码。这时候就需要使用Module了。Module可以给不能修改源码的类提供依赖,当然,能用Inject标注的通过Module也可以提供依赖
-
@Provides 用Provide来标注一个方法,该方法可以在需要提供依赖时被调用,从而把预先提供好的对象当做依赖给标注了@Injection的变量赋值。provide主要用于标注Module里的方法
@Module
public class MainModule {
@Provides
Person providesPerson() {
System.out.println("a person created from MainModule");
return new Person();
}
}
- @Singleton
单例是基于Component的,所以不仅 Provides 的地方要加 @Singleton,Component上也需要加。并且如果有另外一个OtherActivity,并且创建了一个MainComponent,也注入Person,这个时候 MainActivity和OtherActivity中的Person是不构成单例的,因为它们的Component是不同的。
- @Named
作用: 用于区分我们获取依赖的方法
Dagger2寻找依赖是根据我们提供方法的返回值进行匹配的, 当我们遇到不同提供依赖的方法但是返回值类型是相同的应该怎么办呢? Dagger2提供了 Named 注解,用于区分相同返回值类型的不同方法.
- @Qulifier
与 Named一致, Named是继承Qulifier的, 相当于 Dagger2为我们提供的标准化的区分器, 我们也可以进行自定义:
- @Scope
Scope的作用是保证依赖对象在作用范围内单例, 提供局部范围的单例,所谓局部范围就是它的生命周期范围
@Scope 是用来声明作用域的, Dagger2的机制:在同一作用域下,provides 提供的依赖对象会保持单例, 脱离这一作用域, 单例作用就会失效, 可以说 @Singleton 是@Scope 注解的一个标准, 我们还可以去自定义一些 Scope 注解.
总结
Inject,Component,Module,Provides是dagger2中的最基础最核心的知识点。奠定了dagger2的整个依赖注入框架。
Inject主要是用来标注目标类的依赖和依赖的构造函数 Component它是一个桥梁,一端是目标类,另一端是目标类所依赖类的实例,它也是注入器(Injector)负责把目标类所依赖类的实例注入到目标类中,同时它也管理Module。 Module和Provides是为解决第三方类库而生的,Module是一个简单工厂模式,Module可以包含创建类实例的方法,这些方法用Provides来标注