Dagger2 學習筆記

2021-07-23 17:14:07 字數 1754 閱讀 7024

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...