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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,018评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,046评论 2 372
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,215评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,303评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,181评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,171评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,577评论 3 384
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,260评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,546评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,630评论 2 311
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,390评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,260评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,633评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,920评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,210评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,569评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,767评论 2 335

推荐阅读更多精彩内容