Dagger2原始碼分析

2021-08-21 20:52:31 字數 2351 閱讀 6007

2.3 memberinjector注入的過程

2.4 總體的注入流程回顧

上文dagger2入門教程以乙個例項介紹了dagger2的相關元件,概念和使用的方法。本文繼續以上文的例子為基礎,對其進行原始碼分析。

如下圖所示,右邊是我們申明的component和module,左邊是dagger2生成的**。從圖中可以看出,我們申明了activitycomponent,dagger2就會給我們生成對應的dagger2activitycomponent。其他的類都是dagge2內部用來負責依賴注入的工廠類。

我們再看看dagger2內部的工廠類之間的關係

(1) component依賴的構造

上圖是我們申明的fragmentcomponent,下圖是dagger2生成的dagger2fragmentcomponent。

可以看出fragmentcomponent每申明乙個modules和dependencies,在dagger2fragmentcomponent就有乙個對應的屬性,這些屬性需要我們在構造dagger2fragmentcomponent手動的傳進去

再看看我們是怎麼傳進去的

(2)component provider的構造

從下圖中可以看出dagger2component需要注入4個物件,包括3個型別的物件(activityobj,activityscopeobj,fragmentobj),有2個類需要被注入(dagger2fragment,fragmentobj,因為他們存在@inject修飾的屬性)

與之物件的在生成的dagger2fragmentcomponent中就存在3個provider(一種型別的物件對應乙個),還有2個memberinjector,provider負責生成物件,memberinjector負責去給被注入的物件屬性賦值。

雖然dagger2activitycomponent裡面存在provider< activityobjprovider>,但是provider< activityobjprovider>是私有屬性,fragmentcomponent無法利用它來生成activityobj的物件。因此activitycomponent可以通過在申明的時候暴介面來提供對外提供物件的能力(eg:activitycomponent.activityobj),在dagger2activitycomponent裡面activityobj的實現,實際也是通過provider< activityobjprovider>來生成物件。

注意:dagger2裡面都是按照返回值的型別進行物件匹配,與方法名無關

2.2.1 非scope修飾的情況

2.2.2 scope修飾的情況

相比較於非scope修飾的情況,provideactivityscopeprovider用scopeprovider裹了一層,在scopeprovider裡面,用一次變數result來儲存了activitymodule.provideactivityscopeob返回的值,只有第一次呼叫的時候,才會通過activitymodule.provideactivityscopeob去生成activityscopeobj物件,後續直接用result來返回。

因此,可以得出結論:只要是scope修飾的方法,在同乙個component裡面總返回乙份單例

2.2.3 inject修飾建構函式的情況

Dagger2學習筆記

dagger需要注入依賴的地方,需要 inject的註解,共有三種inject方式 identifies injectable constructors,methods,and fields.constructors首先被注入,然後是method和field,父類中的method和field會先於子...

Dagger2 學習筆記

google官方mvp dagger2架構詳解 從零開始搭建android框架系列 6 參考文章 dagger2 使用詳解 1 inject 和 provide 兩種依賴生成方式區別 a.inject 用於注入可例項化的類,provides 可用於注入所有類 b.inject 可用於修飾屬性 構造器...

Dagger2 註解 初識

看部落格之前請先走出這個誤區 module和model,前者指建立依賴物件的物件,後者指的依賴的物件 也就是模型bean dagger2的幾個註解 module,提供建立依賴物件的方法。注意 不能有兩個 provides方法返回同乙個model,否則會報以下異常 2.component,鏈結modu...