dagger2——依賴注入框架篇(上)

前言

使用Dagger2前你必須了解的一些設(shè)計原則
Dagger2 最清晰的使用教程
請先看以上兩篇文章

dagger2 的大名我想大家都已經(jīng)很熟了,它是解決Android或java中依賴注入的一個類庫(DI類庫)唧喉。當(dāng)我看到一些開源的項目在使用dagger2時忍抽,我也有種匆匆欲動的感覺鸠项,因此就立馬想一探它的究竟,到底能給我?guī)碓鯓拥暮锰幯北睢T趯W(xué)習(xí)使用dagger2的過程中浅辙,我遇到了以下的一些困惑:

  • dagger2中的Inject,Component,Module,Provides等等都是什么東東阎姥,有什么作用?
  • dagger2到底能帶來哪些好處呼巴?
  • 怎樣把dagger2應(yīng)用到具體項目中?

在具體學(xué)習(xí)dagger2的時候诊赊,看了好多博客碧磅,看的時候感覺挺簡單的遵馆,但是在真正使用到項目中時候货邓,腦袋就懵了,無從下手职辨,Component應(yīng)該怎么用拨匆,能放些什么方法? Module應(yīng)該放些啥內(nèi)容?Scope怎么起到作用域控制?.....各種疑問就橫空而出台腥。所以也許會有正在學(xué)習(xí)或即將要使用dagger2的同學(xué)在使用過程中遇到和我一樣的困惑绒北,因此我決定把我對dagger2的理解闷游、使用經(jīng)驗分享給大家,希望能對大家有幫助休吠。我會分幾節(jié)給講解dagger2瘤礁。
本節(jié)內(nèi)容
Inject梅尤,Component,Module赡盘,Provides 它們是什么缰揪?怎么去理解它們邀跃?各自有什么作用?主要從抽象的概念講解途戒,不會涉及到具體代碼的剖析喷斋。
提前科普知識點
在講解之前星爪,我希望大家對以下知識點有所了解(知道的同學(xué)可以跳過)
依賴注入設(shè)計模式
依賴注入(Dependency Injection簡稱DI)
java中注解(Annotation)

依賴注入:就是目標(biāo)類(目標(biāo)類需要進行依賴初始化的類,下面都會用目標(biāo)類一詞來指代)中所依賴的其他的類的初始化過程近零,不是通過手動編碼的方式創(chuàng)建久信,而是通過技術(shù)手段可以把其他的類的已經(jīng)初始化好的實例自動注入到目標(biāo)類中漓摩。

di.png

若您還是對依賴注入不了解,點擊我可以讓您了解更多dagger2就是實現(xiàn)依賴注入的一種技術(shù)手段管毙。
其次java注解的概念用法我們就不講了夭咬,dagger2中核心點就是java注解皱埠,點擊我可以了解更多java注解知識

正式開始

以下的內(nèi)容我會嘗試著去模仿dagger2的作者是怎樣一步步完成dagger2這樣偉大的依賴注入類庫的場景來講解(首先這個場景是我意淫的,大家勿噴训枢,模仿該場景主要目的是為了能由簡到難一步步更深入的了解dagger2)
Inject是什么鬼
先看一段代碼:

class A{
    B b = new B();
    C c = new C();
    D d = new D(new E());
    F f = new F(.....);
}

上面的代碼完全沒任何問題恒界,但是總感覺創(chuàng)建對象的這些代碼基本都是重復(fù)的體力勞動砚嘴,那何嘗不想個辦法十酣,把這些重復(fù)的體力勞動用一種自動化的、更省力的方法解決掉际长,這樣就可以讓開發(fā)的效率提高耸采,可以把精力集中在重要的業(yè)務(wù)上了。
我們可以用注解(Annotation)來標(biāo)注目標(biāo)類中所依賴的其他類工育,同樣用注解來標(biāo)注所依賴的其他類的構(gòu)造函數(shù)虾宇,那注解的名字就叫Inject
class A{ @Inject B b; } class B{ @Inject B(){ } }

這樣我們就可以讓目標(biāo)類中所依賴的其他類與其他類的構(gòu)造函數(shù)之間有了一種無形的聯(lián)系。但是要想使它們之間產(chǎn)生直接的關(guān)系如绸,還得需要一個橋梁來把它們之間連接起來嘱朽。那這個橋梁就是Component了。


Inject.png

Component又是什么鬼

Component也是一個注解類搪泳,一個類要想是Component稀轨,必須用Component注解來標(biāo)注該類,并且該類是接口或抽象類岸军。我們不討論具體類的代碼奋刽,我想從抽象概念的角度來討論Component。上文中提到Component在目標(biāo)類中所依賴的其他類與其他類的構(gòu)造函數(shù)之間可以起到一個橋梁的作用凛膏。
那我們看看這橋梁是怎么工作的:Component需要引用到目標(biāo)類的實例杨名,Component會查找目標(biāo)類中用Inject注解標(biāo)注的屬性,查找到相應(yīng)的屬性后會接著查找該屬性對應(yīng)的用Inject標(biāo)注的構(gòu)造函數(shù)(這時候就發(fā)生聯(lián)系了)猖毫,剩下的工作就是初始化該屬性的實例并把實例進行賦值。因此我們也可以給Component叫另外一個名字注入器(Injector)

component.png

小結(jié)下目標(biāo)類想要初始化自己依賴的其他類:
用Inject注解標(biāo)注目標(biāo)類中其他類
用Inject注解標(biāo)注其他類的構(gòu)造函數(shù)
若其他類還依賴于其他的類须喂,則重復(fù)進行上面2個步驟
調(diào)用Component(注入器)的injectXXX(Object)方法開始注入(injectXXX方法名字是官方推薦的名字,以inject開始)

Component現(xiàn)在是一個注入器吁断,就像注射器一樣,Component會把目標(biāo)類依賴的實例注入到目標(biāo)類中坞生,來初始化目標(biāo)類中的依賴仔役。
為啥又造出個Module
現(xiàn)在有個新問題:項目中使用到了第三方的類庫,第三方類庫又不能修改是己,所以根本不可能把Inject注解加入這些類中又兵,這時我們的Inject就失效了。
那我們可以封裝第三方的類庫卒废,封裝的代碼怎么管理呢沛厨,總不能讓這些封裝的代碼散落在項目中的任何地方,總得有個好的管理機制摔认,那Module就可以擔(dān)當(dāng)此任逆皮。可以把封裝第三方類庫的代碼放入Module中参袱,像下面的例子:

@Module public class ModuleClass{
        //A是第三方類庫中的一個類
        A provideA(){
           return A();
        }
}

Module 其實是一個簡單工廠模式电谣,Module里面的方法基本都是創(chuàng)建類實例的方法。接下來問題來了抹蚀,因為Component是注入器(Injector)剿牺,我們怎么能讓Component與Module有聯(lián)系呢?
Component的新職責(zé)
Component是注入器环壤,它一端連接目標(biāo)類晒来,另一端連接目標(biāo)類依賴實例,它把目標(biāo)類依賴實例注入到目標(biāo)類中镐捧。上文中的Module是一個提供類實例的類潜索,所以Module應(yīng)該是屬于Component的實例端的(連接各種目標(biāo)類依賴實例的端)臭增,Component的新職責(zé)就是管理好Module,Component中的modules屬性可以把Module加入Component竹习,modules可以加入多個Module誊抛。

Component_橋梁概念.png

那接下來的問題是怎么把Module中的各種創(chuàng)建類的實例方法與目標(biāo)類中的用Inject注解標(biāo)注的依賴產(chǎn)生關(guān)聯(lián),那Provides注解就該登場了整陌。
Provides最終解決第三方類庫依賴注入問題
Module中的創(chuàng)建類實例方法用Provides進行標(biāo)注拗窃,Component在搜索到目標(biāo)類中用Inject注解標(biāo)注的屬性后,Component就會去Module中去查找用Provides標(biāo)注的對應(yīng)的創(chuàng)建類實例方法泌辫,這樣就可以解決第三方類庫用dagger2實現(xiàn)依賴注入了随夸。

總結(jié)

Inject,Component震放,Module宾毒,Provides是dagger2中的最基礎(chǔ)最核心的知識點。奠定了dagger2的整個依賴注入框架殿遂。
Inject主要是用來標(biāo)注目標(biāo)類的依賴和依賴的構(gòu)造函數(shù)
Component它是一個橋梁诈铛,一端是目標(biāo)類,另一端是目標(biāo)類所依賴類的實例墨礁,它也是注入器(Injector)負責(zé)把目標(biāo)類所依賴類的實例注入到目標(biāo)類中幢竹,同時它也管理Module。
Module和Provides是為解決第三方類庫而生的恩静,Module是一個簡單工廠模式焕毫,Module可以包含創(chuàng)建類實例的方法,這些方法用Provides來標(biāo)注

component_module_inject.png

希望能幫您更好的理解dagger2驶乾。
dagger2——重點概念講解邑飒,融合篇(中)
原文地址

參考文章,更詳細

[Android]使用Dagger 2依賴注入 - DI介紹(翻譯)

[Android]使用Dagger 2依賴注入 - API(翻譯)

[Android]使用Dagger 2依賴注入 - 自定義Scope(翻譯)

[Android]使用Dagger 2依賴注入 - 圖表創(chuàng)建的性能(翻譯)

[Android]Dagger2Metrics - 測量DI圖表初始化的性能(翻譯)

[Android]使用Dagger 2進行依賴注入 - Producers(翻譯)

[Android]在Dagger 2中使用RxJava來進行異步注入(翻譯):

[Android]使用Dagger 2來構(gòu)建UserScope(翻譯):

[Android]在Dagger 2中Activities和Subcomponents的多綁定(翻譯)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轻掩,一起剝皮案震驚了整個濱河市幸乒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唇牧,老刑警劉巖罕扎,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丐重,居然都是意外死亡腔召,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門扮惦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臀蛛,“玉大人,你說我怎么就攤上這事∽瞧停” “怎么了客峭?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抡柿。 經(jīng)常有香客問我舔琅,道長,這世上最難降的妖魔是什么洲劣? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任备蚓,我火速辦了婚禮,結(jié)果婚禮上囱稽,老公的妹妹穿的比我還像新娘郊尝。我一直安慰自己,他們只是感情好战惊,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布流昏。 她就那樣靜靜地躺著,像睡著了一般吞获。 火紅的嫁衣襯著肌膚如雪横缔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天衫哥,我揣著相機與錄音,去河邊找鬼襟锐。 笑死撤逢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粮坞。 我是一名探鬼主播蚊荣,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼莫杈!你這毒婦竟也來了互例?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤筝闹,失蹤者是張志新(化名)和其女友劉穎媳叨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體关顷,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡糊秆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了议双。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痘番。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汞舱,到底是詐尸還是另有隱情伍纫,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布昂芜,位于F島的核電站莹规,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏说铃。R本人自食惡果不足惜访惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腻扇。 院中可真熱鬧债热,春花似錦、人聲如沸幼苛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舶沿。三九已至墙杯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間括荡,已是汗流浹背高镐。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畸冲,地道東北人嫉髓。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像邑闲,于是被迫代替她去往敵國和親算行。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Dagger2 入門 2016-12-21 更新:添加@Subcomponent注解以及Lazy與Provider...
    fxzou閱讀 28,530評論 77 331
  • 幾個問題 看到Dagger2這個詞的時候苫耸,相信很多人會有很多的疑問如下:Dagger2如何使用在例子中州邢?Injec...
    codeHoward閱讀 7,010評論 4 10
  • 部分內(nèi)容參考自:[Android]使用Dagger 2依賴注入 - DI介紹(翻譯)[Android]使用Dagg...
    AItsuki閱讀 47,264評論 66 356
  • (一) 不知何時開始,夾道的梧桐葉紛紛變成了鎏金色褪子。也許是秋日的第一縷涼風(fēng)量淌,拂得它們一心歡喜,臉色也都熱情了不少褐筛。...
    BitE咬咬閱讀 649評論 0 0
  • 8.6 今天上午我們有一起聚集在大廳类少,玩瘋狂超市的游戲。簡單的來說就是要過關(guān)斬將開公司渔扎,想方設(shè)法去融資硫狞!謝謝我是不...
    故事雨閱讀 322評論 0 0