Dagger2學習之路(Part 1)

一個暱稱而已T發表於2017-03-17

本文就記錄本人學習Dagger2時的一些問題或者理解。
至於關於Dagger2是什麼啊,做什麼用的啊,巴拉巴拉。我就不在此贅述了。

不過得吐槽一句,由於本人英文不是很好,在沒有任何該知識基礎的情況看英文文件很吃力,所以不得不看國內的相關部落格,不過最開始找了好久,很多看起來都沒有感覺,其內容泛泛而談,缺少原始碼例項。(當然了,這純屬吐槽,畢竟有些部落格也是別人自己一字一字碼出來的)。


最開始入門時,有幸發現了一篇很讚的文章,學習完之後也算是入門了。(學習自:使用Dagger 2進行依賴注入
這篇文章裡面就Dagger2中的@Module@Provides@Component三個註釋的使用舉出了通俗易懂的原始碼例項,讓人一看就能對此有了直觀的瞭解。

好了,在開始使用dagger2之前呢,需要先配置好Gradle,這裡可以參觀官方的,是最準確的。
這裡寫圖片描述
另外,可能還需要在module的build.gradle下新增如下依賴,否則會在編譯報錯,如下圖:

compile 'javax.annotation:javax.annotation-api:1.2'

這裡寫圖片描述

(也許是跟下圖中配置的版本有關,這點我沒有深究了)
這裡寫圖片描述

接著,就可以跟著文章擼程式碼了。(可以在這裡直接clone我的,為了直觀的瞭解,我將自己擼的示例分成了test1、test2兩部分,即分別對應文中的簡單的依賴注入多層依賴


準備好之後,我就得注入一點自己的觀點或者理解了。

1、在簡單的依賴注入中,需要在MainActivity中注入一個UserModel的例項,首先就需要一個依賴模組,為了直觀,我命名成了MainActivityMoudle(被@Module標識了),裡面就有一個被@Provides標識的方法provideUserModel(),該方法返回一個目標例項,當然了,這個方法名是可以隨便命名的,只要符合Java的命名規則即可,但是一定得有@Provides標識。

2、接著就需要一個“注入器”(即Injector,但是在Dagger2中,將其稱為Component。)將例項注入到指定的依賴中(在本例中即MainActivity)。在構建Injecyor時的注意事項在文中已經說得很清楚了,我就不再複述,只是提醒大家一定得注意了。 我在這裡要說的是,注入方法inject()的方法名也是可以自定義的,只需要在呼叫的時候呼叫正確的方法名即可。

3、在注入時,會用到Dagger自動生成的相應的Component類(在使用前一定要將專案ReBuild一遍,才會生成該類),在我的Demo中為DaggerMainActivityComponent(因為我在構建Injector為MainActivityComponent)。在這裡,就可以很直觀的看到命名規律:Dagger+定義的Component名。還有在builder()方法後鏈式引用了mainActivityModule()方法,其引數就是相應的Module,這裡的mainActivityModule()方法的命名也是有規律的,即對應的Module名,首字母小寫即可。

4、被注入的例項的引用需要用@Inject標識,且不能為private,並@Inject不能標識局域變數。需要多少個例項,就用@Inject表示相應數量的引用變數即可。
這裡寫圖片描述

5、至於多層依賴,也比較容易理解,只要解讀一下文章與例項程式碼即可。
但是要注意,在多層依賴時,因為使用了MainActivityComponent作為低階Component來提供依賴,原本MainActivityComponent中的inject()方法需要去掉,注意,是去掉,而不是與UserModel userModel()共存,否則是無法ReBuild的。

相關文章