google官方mvp+dagger2架構詳解【從零開始搭建android框架系列(6)】
參考文章:dagger2 使用詳解
(1). @inject 和 @provide 兩種依賴生成方式區別
a. @inject 用於注入可例項化的類,@provides 可用於注入所有類
b. @inject 可用於修飾屬性、構造器和一般方法,可用於任何非 module 類,@provides 只可用於用於修飾非建構函式,並且該函式必須在某個module內部
c. 假如乙個類中@inject 同時修飾了構造器和一般函式方法,則一般函式方法會在構造器執行完以後立即執行,可用於做一些初始化的工作,@provides 修飾的函式必須以 provide 開頭
(2)@module
有時候我們並不能直接在建構函式裡面新增@inject註解,或者類中存在多個建構函式時,@inject也只能註解其中乙個建構函式,不能註解多個建構函式,這裡是會產生歧義性,因為dagger2無法確認呼叫哪乙個建構函式來生成例的例項物件。另外一種情況是我們在專案中引用第三方類庫時,也是無法直接在類建構函式中新增@inject註解的,所以我們需要用到@module註解了。
@module是用來生產例項來注入物件的,它類似乙個工廠,集中建立要注入的類的物件例項。下面我們引用一下gson庫來看看@module是怎麼使用的,建立mainmodule類:
/*
@module註解表示這個類提供生成一些例項用於注入
*/@module
public
class
mainmodule
}
(3)@module的優先順序高於@inject。
dagger2 使用詳解
細心的同學就會發現了,我們提供了兩個可以生成poetry例項的方法,乙個是在poetry類的建構函式時候用@inject提供的例項建立方法,乙個是在poetrymodule中的@privodes註解的providepoetry方法,而在上面的執行結果中我們發現是呼叫了poetrymodule提供的方法,這裡就要說明一下優先順序的問題,在上面這種既在建構函式中用@inject提供注入**,也在@module中用@privodes註解提供注入**的,dagger2是先從@privodes查詢類例項,如果找到了就用@module提供的方法來建立類例項,如果沒有就從建構函式裡用@inject註解的生成類例項,如果二者都沒有,則報錯,簡而言之,就是@module的優先順序高於@inject。
另外這裡還要說明一點,在providepoetry(string)方法中,string這個引數也是要注入提供的,必須也要有在同乙個聯結器裡面有提供,其中在構建類例項的時候,會按照以下順序執行:
從module中查詢類例項建立方法
module中存在建立方法,則看此建立方法有沒有引數
如果有引數,這些引數也是由component提供的,返回步驟1逐一生成引數類例項,最後再生成最終類例項
如果無引數,則直接由這個方法生成最終類例項
module中沒有建立方法,則從建構函式裡面找那個用@inject註解的建構函式
如果該建構函式有引數,則也是返回到步驟1逐一生成引數類例項,最後呼叫該建構函式生成類例項
如果該建構函式無引數,則直接呼叫該建構函式生成類例項
以上就是一次注入生成類例項的生成步驟。
(4)學習dagger2過程中碰見的其他可以學習的文章
dagger2 使用詳解
dagger 2: step to step
詳解dagger2
Dagger2學習筆記
dagger需要注入依賴的地方,需要 inject的註解,共有三種inject方式 identifies injectable constructors,methods,and fields.constructors首先被注入,然後是method和field,父類中的method和field會先於子...
dagger2 重點筆記
官方架構例子,裡面有個dagger2的結合的例子 dagger2 通過註解來生成 定義不同的角色,主要的註解有 inject module component provides scope subcomponent 等。簡單地說,通過物件型別傳遞 物件以來,通過 module和 provides 提...
Dagger2 註解 初識
看部落格之前請先走出這個誤區 module和model,前者指建立依賴物件的物件,後者指的依賴的物件 也就是模型bean dagger2的幾個註解 module,提供建立依賴物件的方法。注意 不能有兩個 provides方法返回同乙個model,否則會報以下異常 2.component,鏈結modu...