Dagger 注解介紹

@Inject :

這個注解有兩種使用方式,一種是注解類的構(gòu)造函數(shù),一種是注解類的成員變量篡石。

先說下第一種,在類的構(gòu)造函數(shù)上注解的作用是為了創(chuàng)建一個當(dāng)前類的工廠類西采。

第二種凰萨,在類的成員變量上注解是為了創(chuàng)建一個當(dāng)前類的成員注入對象。

@Inject 注解的兩個功能基本上已經(jīng)明確了苛让,一是 為了提供被注入的對象沟蔑,二是提供注入到當(dāng)前類的對象湿诊。

@Provides

這個注解使用起來比較簡單狱杰,主要的作用是為了彌補@Inject注解的不足,因為@Inject在提供注入對象的時候必須要在構(gòu)造函數(shù)上注解厅须,那么這就存在局限仿畸。@Provides就是為了彌補這種局限的。

可以看到構(gòu)造函數(shù)中需要所在的Module 對象朗和,下面再說說這個module错沽。

@Provides 注解的功能就是標(biāo)注提供被注入的對象的方法,是為了彌補@Inject 注解出現(xiàn)的眶拉。

@Module

@Module注解在我看來就是提供一個場所千埃,用來生成被注入的對象的場所,由上文可以知道我們可以用過兩種方式提供被注入的對象忆植,@Inject 標(biāo)識構(gòu)造函數(shù)放可,@Provides 標(biāo)識提供注入對象的方法。但是如果在整個項目中任意位置這么寫的話朝刊,我想這個工作量可能會很巨大耀里,所以就出現(xiàn)了Module注解,一是為了整理歸攏當(dāng)前需要的提供的注入對象拾氓,二是便于維護(hù)冯挎,當(dāng)前module內(nèi)的可以互相提供。

提問:
不同module 咙鞍,相同component中的是否可以互相提供房官? 這個都等Component之后在回答。

通過@Module 標(biāo)記的類不會生成新的代碼续滋。

@Component

現(xiàn)在我們來整理一下我們目前有的東西翰守,

一個是通過@Inject注解構(gòu)造函數(shù)的被注入對象提供工具。
一個是通過@Provides注解的被注入對象的方法工具吃粒。
一個是提供注入對象的場所潦俺。
一個是通過@Inject注解成員變量的當(dāng)前類的注入對象工具

那么我們現(xiàn)在缺少一個東西,來講提供的對象注入的指定的類中,那就是@Component, 它可以知道它能從哪些地方來獲取被注入的對象事示,它有一個方法能夠調(diào)用當(dāng)前類的注入工具去注入對象早像。更具體的說它的作用是將提供注入對象的場所和要去注入的類建立連接。

可以看到它通過Builder對象進(jìn)行初始化肖爵,初始化的時候會需要一個Module , 不過已經(jīng)被標(biāo)記為廢棄了卢鹦,之后會給它的成員變量賦值。成員變量時注入接口的泛型對象劝堪,泛型類型就是在寫inject方法的時候的參數(shù)類型冀自,這個成員變量會通過之前的@Inject 方法標(biāo)注的成員變量編譯出來的注入工具生成。通過創(chuàng)建的時候也需要一個Proivder<T>泛型對象秒啦,這里直接就是通過@Inject 注解的構(gòu)造函數(shù)編譯出來的工具生成熬粗。

接下來看看兩個對象的情況:

我們只關(guān)注改變,只有成員注入工具類和連接Component 發(fā)生改變

第一個發(fā)生變化的是注入工具的構(gòu)造函數(shù)變成了兩個參數(shù)余境,并且注入的函數(shù)變成了三個驻呐。這些是注入工具的改變.。

這里看到主要有兩個變化芳来,按照調(diào)用順序來分析含末。

首先在生成Builder的時候現(xiàn)在必須會持有一個UserModule 了,之前的時候是沒有的即舌。

其次是在initialize的時候佣盒,會先通過Builder的Moudle去生成一個通過@Provides 注解的注入工具類,然后把這個生成的工具類和之前的Inject生成的工具類一起給Activity的注入工具類顽聂。

回答之前的問題:
答案是可以的肥惭,在同一個Component 下的module中的代碼是可以互相依賴的。

下面說一下為什么芜飘?

我只取了比較重要的的地方务豺,可以看到,之前的時候在類成員注入工具在使用的時候必須有兩個注入對象的提供類嗦明,并且全是泛型的接口對象笼沥,這就有很大的優(yōu)勢。之前提供的是userModule, 現(xiàn)在的則是persionmodule娶牌, 而實現(xiàn)改變的方式就是在Builder中奔浅,看來Builder中會持有所有的擁有provides注解的module 成員。這就是為了在注入的時候能夠通過對應(yīng)module生成注入對象提供工具诗良。這一個簡單的注入實現(xiàn)就完成汹桦。之后的更多的注解,包括@scope ,@subcomponent鉴裹,等都是提供更多的變化舞骆, 基本的邏輯是不會改變的钥弯。

@Singleton

Dagger提供的@scope注解注解的一種,簡單來說就是單例督禽。但是說一下具體的要求或者說功能:

1. 親測不能放在@Inject注解的構(gòu)造函數(shù)上
2. 提供一定范圍內(nèi)的一個對象的唯一性脆霎。
3. 單例的范圍是根Component。

這里有一個點需要說一下狈惫,不要把@Scope 想的特別神話睛蛛,我最開始的時候就搞不懂這個限制是如何實現(xiàn)的。不過只要明白兩個點就可以胧谈,一是什么對象是單例的忆肾?二是單例的范圍是什么?

那么回答一下菱肖,

被@singleton 標(biāo)記的@Provides方法的返回值是單例的客冈。

單例的范圍是@Singletonb標(biāo)記的Component ,這里涉及到一個subcomponent的事情之后再說,接下來看一下如何實現(xiàn)的:

重點應(yīng)該能看出來在DoubleCheck.provider();

這里是具體的實現(xiàn)蔑滓,這里通過包裝類的形式郊酒,來判斷的,感覺這個地方是用來控制線程的键袱??

因為通過測試來看摹闽,只有同一個的 Componet注入的對象才是單例的蹄咖,但是這就有一個問題,其實在inject之前的付鹿,所有的初始化動作其實就都已經(jīng)完成澜汤, 注入的時候?qū)嶋H上是調(diào)用注入工具的方法來從提供注入對象的工具中來取的,那么其實實際上的單例過程應(yīng)該是在從提供注入對象工具中取對象的過程舵匾。

所以這里才是確定單例的地方俊抵,默認(rèn)的時候result就是UN, 之后是枷鎖,賦值坐梯,返回徽诲,這就實現(xiàn)了對象的單例。

那么之后就有一個問題吵血,我們在自定義Scope的時候谎替,真正要實現(xiàn)的是什么?

其實我們通過自定義的Scope所實現(xiàn)的根本其實就是在指定范圍內(nèi)的單例蹋辅,跟其他任何因素都沒有關(guān)系钱贯,沒有生命周期之類。Scope 代表的就是單例侦另。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秩命,一起剝皮案震驚了整個濱河市尉共,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弃锐,老刑警劉巖爸邢,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拿愧,居然都是意外死亡杠河,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門浇辜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來券敌,“玉大人,你說我怎么就攤上這事柳洋〈纾” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵熊镣,是天一觀的道長卑雁。 經(jīng)常有香客問我,道長绪囱,這世上最難降的妖魔是什么测蹲? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鬼吵,結(jié)果婚禮上扣甲,老公的妹妹穿的比我還像新娘。我一直安慰自己齿椅,他們只是感情好琉挖,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涣脚,像睡著了一般示辈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遣蚀,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天矾麻,我揣著相機(jī)與錄音,去河邊找鬼妙同。 笑死射富,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粥帚。 我是一名探鬼主播胰耗,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芒涡!你這毒婦竟也來了柴灯?” 一聲冷哼從身側(cè)響起卖漫,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赠群,沒想到半個月后羊始,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡查描,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年突委,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冬三。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡匀油,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勾笆,到底是詐尸還是另有隱情敌蚜,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布窝爪,位于F島的核電站弛车,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蒲每。R本人自食惡果不足惜纷跛,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啃勉。 院中可真熱鬧忽舟,春花似錦、人聲如沸淮阐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泣特。三九已至,卻和暖如春挑随,著一層夾襖步出監(jiān)牢的瞬間状您,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工兜挨, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留膏孟,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓拌汇,卻偏偏與公主長得像柒桑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子噪舀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

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