Dragger2是一个依赖注入的框架 ,可以减少代码的耦合度
IOC(Inversion of Control)
是原来由程序代码中主动获取的资源,转变由第三方获取并使原来的代码被动接收的方式,以达到解耦的效果,称为控制反转
使用方式:
第一步:
build.gradle(app)中加入 以下代码
implementation 'com.google.dagger:dagger:2.4'
annotationProcessor 'com.google.dagger:dagger-compiler:2.4'
由于可能当前包中没有下面内容会报错
java.lang.NoClassDefFoundError: javax/annotation/Generated
解决方法:在build.gralde(app中)自己加入对应的内容
implementation'javax.annotation:javax.annotation-api:1.3.2'
annotationProcessor("javax.annotation:javax.annotation-api:1.3.2")
项目中分为了三部分
obj (代表需要使用到的对象)
component (用于组织module并进行注入),
module(用于提供注入对象) ,
第二步:(这里以http对象的获取为例)
提供对应的obj
第三步 提供Moudle
第四步:提供对应的Component
第五步:在使用的地方加入注解 @Inject 并且调用生成的方法
执行结果:
这样就完成了httpObject的注解使用.
注意:这时如果定义两个 HttpObject 类的话 它对应的hascode是不同的 代表是两个不同的对象
eg:
打印结果:
如果想使用同一个结果的话:需要在Moudle的类上 和@Provides 对应的方法 以及Component上方增加 @Singleton 注解,注意这里三个地方必须都加入
再次运行 :结果hashcode相同 为同一个对象
需要注意的是 此时的单例 只在注入的类中 局部有效 也就是说如果两个activity同时注入了httpobject 这两个activity 还是不同的对象
比如此时在SecondActivity中加入httpObject
打印结果为:
使用全局的局部变量 需要使用Application 在其中加入代码
如下:
然后再MainActivity和其他Activity中调用application中生成的myComponent 调用注入方法:
如 MainActivity中
SecondActivity中
执行结果:两处的hascode值相同
上面所写为全局单例实现方法
在dagger2中不能使用多个Componet注入同一个类中 这就需要进行Component组合.
有两种方式可以使Component进行组合在一起
第一种:使用dependencies 来管理多个Component了.
第二种:使用@SubCOmponent.
下面先来看下第一种dependencies 的管理方式:
需要注意的是:在多个Component中需要注意的是不能使用相同的Sope,所以这里我们需要自己定义Scope可以仿照@SingleTon 写几个
比如:
这两个Scope就是仿照SingleTon写的.
给每个component使用不同的scope并将依赖关系加入
比如我这里增加了一个PresenterObj,一个PersenterModule和一个PresenterComponet
public class PresenterObj {
}
httpMoudle变为
MyComponent中增加依赖关系
使用方式也需要改变 如下在MainActivity中使用
即可注入成功.
第二种方式.使用SubComponet.
第一步 :建立对应的 obj和module
public class MainObject {
}
public class SubObject {
}
使用@SubComponent方法时,需要在子component上设置注入到哪个类的方法
如下 injectMainActivity()方法
在主Component上要返回子Component
重点 编译一下
然后再MainAcitivity中使用
注入成功!!
其他用法:
(1).Dagger2中注入参数的用法:
如果需要参数注入的时候需要在moudle中 加入成员变量 也就是参数的内容
生成moudle对应的构造函数 在Activity中使用的时候使用builder的方式 设置对应的参数
eg:
activity中使用的时候:
(2).使用限定符(@Named) 确定使用moudle中的哪个方法
比如在MainMoudle找那个加入以下方法:
在activity中如下使用即可
(3)如果 A对象的构造方法中需要B 对象 则 只需要将 moudle中进行提供就可以
eg:
在MainMoudle中
在activity中如下可以直接使用.
(4)dagger2中的懒加载
有两种使用方式 一种Lazy 一种Provider 区别是lazy是单例模式
这里需要注意的是:两者必须调用get()方法才能真正的创建对象
使用方式如下:
在activity中
从以下执行结果中可以看出 lazy是使用的单例