Dagger2基本使用

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是使用的单例

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容