前言
如果您對(duì)dagger2的概念只酥,整個(gè)依賴注入框架還不清楚飘诗,可以先了解下我的前2篇文章:dagger2——基礎(chǔ)依賴注入框架篇(上)
dagger2——重點(diǎn)概念講解教藻、融合篇(中)
- dagger2到底能帶來哪些好處墓捻?
- dagger2怎么使用致板?
我將結(jié)合這2點(diǎn)來進(jìn)行本文的講解交煞。并且會(huì)有具體的sample。
dagger2到底有哪些好處斟或?
咱們直奔主題:
- 增加開發(fā)效率素征、省去重復(fù)的簡(jiǎn)單體力勞動(dòng)首先new一個(gè)實(shí)例的過程是一個(gè)重復(fù)的簡(jiǎn)單體力勞動(dòng),dagger2完全可以把new一個(gè)實(shí)例的工作做了缕粹,因此我們把主要精力集中在關(guān)鍵業(yè)務(wù)上稚茅、同時(shí)也能增加開發(fā)效率上。省去寫單例的方法平斩,并且也不需要擔(dān)心自己寫的單例方法是否線程安全亚享,自己寫的單例是懶漢模式還是餓漢模式。因?yàn)閐agger2都可以把這些工作做了绘面。
- 更好的管理類實(shí)例每個(gè)app中的ApplicationComponent管理整個(gè)app的全局類實(shí)例欺税,所有的全局類實(shí)例都統(tǒng)一交給ApplicationComponent管理,并且它們的生命周期與app的生命周期一樣揭璃。每個(gè)頁面對(duì)應(yīng)自己的Component晚凿,頁面Component管理著自己頁面所依賴的所有類實(shí)例。因?yàn)镃omponent瘦馍,Module歼秽,整個(gè)app的類實(shí)例結(jié)構(gòu)變的很清晰。
-
解耦假如不用dagger2的話情组,一個(gè)類的new代碼是非吃锟辏可能充斥在app的多個(gè)類中的,假如該類的構(gòu)造函數(shù)發(fā)生變化院崇,那這些涉及到的類都得進(jìn)行修改肆氓。設(shè)計(jì)模式中提倡把容易變化的部分封裝起來。
我們用了dagger2后底瓣。
假如是通過用Inject注解標(biāo)注的構(gòu)造函數(shù)創(chuàng)建類實(shí)例谢揪,則即使構(gòu)造函數(shù)變的天花亂墜,我們基本上都不需要修改任何代碼捐凭。
假如是通過工廠模式Module創(chuàng)建類實(shí)例拨扶,Module其實(shí)就是把new類實(shí)例的代碼封裝起來,這樣即使類的構(gòu)造函數(shù)發(fā)生變化茁肠,只需要修改Module即可屈雄。
有過一個(gè)這樣的問題,Module的構(gòu)造函數(shù)也會(huì)發(fā)生變化官套,發(fā)生變化后,相應(yīng)的new Module的類也發(fā)生變化,這就沒有達(dá)到解耦的效果奶赔。首先解耦不是說讓類之間或模塊之間真的一點(diǎn)關(guān)系都沒有了惋嚎,解耦達(dá)到的目的是讓一個(gè)類或一個(gè)模塊對(duì)與自己有關(guān)聯(lián)的類或模塊的影響降到最低,不是說這種影響就完全沒有了站刑,這是不可能的另伍。
解耦還有個(gè)好處,就是方便測(cè)試绞旅,若需要替換為網(wǎng)絡(luò)測(cè)試類摆尝,只需要修改相應(yīng)的Module即可。
項(xiàng)目中使用dagger2注意點(diǎn)
具體的代碼就不講了因悲,dagger2 sample地址堕汞,大家自行下載。這里重點(diǎn)說下dagger2對(duì)目標(biāo)類進(jìn)行依賴注入的過程晃琳,現(xiàn)在假設(shè)要初始化目標(biāo)類中的其中一個(gè)依賴類的實(shí)例讯检,那具體步驟就在下面:
- 查找Module中是否存在創(chuàng)建該類的方法。
- 若存在創(chuàng)建類方法卫旱,查看該方法是否存在參數(shù) 步驟2.1. 若存在參數(shù)人灼,則按從步驟1開始依次初始化每個(gè)參數(shù) 步驟2.2. 若不存在參數(shù),則直接初始化該類實(shí)例顾翼,一次依賴注入到此結(jié)束步驟
- 若不存在創(chuàng)建類方法投放,則查找Inject注解的構(gòu)造函數(shù), 看構(gòu)造函數(shù)是否存在參數(shù) 步驟3.1. 若存在參數(shù)适贸,則從步驟1開始依次初始化每個(gè)參數(shù) 步驟3.2. 若不存在參數(shù)灸芳,則直接初始化該類實(shí)例,一次依賴注入到此結(jié)束
以上是dagger2進(jìn)行的一次依賴注入的步驟取逾,其實(shí)這個(gè)步驟是一個(gè)遞歸的過程耗绿,并且在查找類的實(shí)例的過程中Module的級(jí)別要高于Inject,這概念在上一篇講過砾隅。
下面在說下注意的幾點(diǎn)
一個(gè)app必須要有一個(gè)Component(名字可以是ApplicationComponent)用來管理app的整個(gè)全局類實(shí)例
多個(gè)頁面可以共享一個(gè)Component
不是說Component就一定要對(duì)應(yīng)一個(gè)或多個(gè)Module误阻,Component也可以不包含Module
自定義Scope注解最好使用上,雖然不使用也是可以讓項(xiàng)目運(yùn)行起來的晴埂,但是加上好處多多究反。
總結(jié)
好了關(guān)于dagger2的所有的概念知識(shí)點(diǎn)到此終于結(jié)束了,希望能幫助大家儒洛,與大家共勉精耐,有問題可以隨時(shí)與我溝通。
dagger2 sample地址