Dragger2是一個(gè)依賴注入的框架 ,可以減少代碼的耦合度
IOC(Inversion of Control)
是原來由程序代碼中主動(dòng)獲取的資源谣殊,轉(zhuǎn)變由第三方獲取并使原來的代碼被動(dòng)接收的方式,以達(dá)到解耦的效果芒涡,稱為控制反轉(zhuǎn)
使用方式:
第一步:
build.gradle(app)中加入 以下代碼
implementation 'com.google.dagger:dagger:2.4'
annotationProcessor 'com.google.dagger:dagger-compiler:2.4'
由于可能當(dāng)前包中沒有下面內(nèi)容會(huì)報(bào)錯(cuò)?
java.lang.NoClassDefFoundError: javax/annotation/Generated
解決方法:在build.gralde(app中)自己加入對(duì)應(yīng)的內(nèi)容
implementation'javax.annotation:javax.annotation-api:1.3.2'
annotationProcessor("javax.annotation:javax.annotation-api:1.3.2")
項(xiàng)目中分為了三部分
obj (代表需要使用到的對(duì)象)
? component (用于組織module并進(jìn)行注入),
module(用于提供注入對(duì)象) ,
第二步:(這里以http對(duì)象的獲取為例)
提供對(duì)應(yīng)的obj
第三步 提供Moudle
第四步:提供對(duì)應(yīng)的Component
第五步:在使用的地方加入注解 @Inject 并且調(diào)用生成的方法
執(zhí)行結(jié)果:
這樣就完成了httpObject的注解使用.
注意:這時(shí)如果定義兩個(gè) HttpObject 類的話? 它對(duì)應(yīng)的hascode是不同的 代表是兩個(gè)不同的對(duì)象
eg:
打印結(jié)果:
如果想使用同一個(gè)結(jié)果的話:需要在Moudle的類上 和@Provides 對(duì)應(yīng)的方法 以及Component上方增加?@Singleton 注解,注意這里三個(gè)地方必須都加入
再次運(yùn)行 :結(jié)果hashcode相同 為同一個(gè)對(duì)象
需要注意的是 此時(shí)的單例 只在注入的類中 局部有效? ? ? ?也就是說如果兩個(gè)activity同時(shí)注入了httpobject 這兩個(gè)activity 還是不同的對(duì)象
比如此時(shí)在SecondActivity中加入httpObject
打印結(jié)果為:
使用全局的局部變量 需要使用Application 在其中加入代碼
如下:
然后再M(fèi)ainActivity和其他Activity中調(diào)用application中生成的myComponent 調(diào)用注入方法:
如 MainActivity中
SecondActivity中
執(zhí)行結(jié)果:兩處的hascode值相同
上面所寫為全局單例實(shí)現(xiàn)方法
在dagger2中不能使用多個(gè)Componet注入同一個(gè)類中 這就需要進(jìn)行Component組合.
有兩種方式可以使Component進(jìn)行組合在一起
第一種:使用dependencies 來管理多個(gè)Component了.
第二種:使用@SubCOmponent.
下面先來看下第一種dependencies 的管理方式:
需要注意的是:在多個(gè)Component中需要注意的是不能使用相同的Sope,所以這里我們需要自己定義Scope可以仿照@SingleTon 寫幾個(gè)
比如:
這兩個(gè)Scope就是仿照SingleTon寫的.
給每個(gè)component使用不同的scope并將依賴關(guān)系加入?
比如我這里增加了一個(gè)PresenterObj,一個(gè)PersenterModule和一個(gè)PresenterComponet
public class PresenterObj {
}
httpMoudle變?yōu)?/p>
MyComponent中增加依賴關(guān)系
使用方式也需要改變? 如下在MainActivity中使用
即可注入成功.
第二種方式.使用SubComponet.
第一步 :建立對(duì)應(yīng)的 obj和module
public class MainObject {
}
public class SubObject {
}
使用@SubComponent方法時(shí),需要在子component上設(shè)置注入到哪個(gè)類的方法
如下 injectMainActivity()方法
在主Component上要返回子Component
重點(diǎn) 編譯一下
然后再M(fèi)ainAcitivity中使用
注入成功!!
其他用法:
(1).Dagger2中注入?yún)?shù)的用法:
如果需要參數(shù)注入的時(shí)候需要在moudle中 加入成員變量 也就是參數(shù)的內(nèi)容?
生成moudle對(duì)應(yīng)的構(gòu)造函數(shù)? 在Activity中使用的時(shí)候使用builder的方式 設(shè)置對(duì)應(yīng)的參數(shù)?
eg:
activity中使用的時(shí)候:
(2).使用限定符(@Named) 確定使用moudle中的哪個(gè)方法
比如在MainMoudle找那個(gè)加入以下方法:
在activity中如下使用即可
(3)如果 A對(duì)象的構(gòu)造方法中需要B 對(duì)象? 則 只需要將 moudle中進(jìn)行提供就可以?
eg:
在MainMoudle中
在activity中如下可以直接使用.
(4)dagger2中的懶加載
有兩種使用方式 一種Lazy 一種Provider 區(qū)別是lazy是單例模式
這里需要注意的是:兩者必須調(diào)用get()方法才能真正的創(chuàng)建對(duì)象
使用方式如下:
在activity中
從以下執(zhí)行結(jié)果中可以看出 lazy是使用的單例