MVP + Dagger2源碼體驗

你們好,我是蒼王。
android

如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。設計模式

[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表架構


相信有關注個人人,都會看過我第一編介紹的Todo-mvp源碼體驗,這是基礎編。
app

這一章的難度理解難度將會很是大。框架

這個系列的課程適合研發有Android有一年半左右的同窗參考。ide

基於工做的問題,大型公司其實都不怎麼使用這種注入框架,而是直接用代碼完成解耦的。可是學習期框架架構,對咱們瞭解註解的使用和構建學習一些設計模式有着重要的做用。Dagger的設計的確很是精妙。源碼分析

一.基礎介紹

估計不少新手看Dagger2都會看到一頭霧水,由於Dagger2使用的依賴反轉的設計模式原則。組件化

舉個例子,我去買東西,告訴老闆我須要什麼品類的東西,老闆就說你等着,我拿給你就行了。學習

這個部分都是老闆幫咱們完成了。ui

推薦一個很是好的Dagger2的入門文章給你們,裏面都是Dagger2基本的使用原理,和通常的架構設計,看完以後估計你們應該不會再一頭霧水。

Dagger2 入門,以初學者角度.

Google官方MVP+Dagger2架構詳解【從零開始搭建android框架系列(6)】


若是沒有Dagger基礎,並且不看介紹,而後直接看一下的內容,估計你會一頭霧水。(最好下源碼對着看)

沒Dagger基礎必定要看介紹

沒Dagger基礎必定要看介紹

沒Dagger基礎必定要看介紹

重要的事情說三次!!!

二.源碼分析

(一).引用相關

關於引用,須要使用android-apt的引用


還有Dagger2所須要的依賴


一開始下載下來,打開XXActivity的文件發現都會報紅,而後須要咱們make projects一次,Dagger2會自動生成一些Dagger注入的類。


編譯完成後,咱們會在apt的文件夾裏面,看到生成的Dagger代碼,很顯然是經過apt代碼編寫的代碼。

這裏的套路和MVVM有點類似,可是MVVM是源碼就提供MVVM的自動編碼,而Dagger2須要apt去作。


(二).Application註解

咱們看自定義的ToDoApplication,能夠簡單到看到mRepositoryComponnet是數據源在這裏聲明爲全局的變量


這裏會引用到自定義的ApplicationModule實體類,外面的變量經過provideContext獲取ApplicationContext參數。


(三).Component註解

咱們這裏先以TaskDetailActivity爲例吧(這裏不對Dagger2的注入方式再進行介紹,能夠看我基礎介紹裏面的網址學習)

咱們看到DaggerTaskDetailComponent是使用了建造者模式的鏈式結構。


咱們看到的是自動生成的DaggerTaskDetailComponent是繼承TaskDetailComponent

咱們看到起使用@Provider就會生成Provider類型的變量

使用@Inject標誌的變量就會被聲明爲MembersInjector的變量

由於使用了inject(this)還會將整個TaskDetailActivity聲明爲MembersInjector的變量


看到這裏應該很清楚,起初始化的時候,還會調用intialize方法


這裏很明顯,每一個變量都會經過XXXFactory.create來獲取相應的建立出來(這裏使用很明顯就是工廠模式)

Module聲明的實體主要是用到了工廠模式生成

使用inject(this)的時候會調用injectMembers的方法替換變量


深刻到TaskDetailActivity_MembersInjector實現類,初始Presenter對象


這裏初始化的時候會輸入PresenterProvider的變量


其是經過靜態的create方法作成工廠的。


這裏是DaggerTaskDetailComponent的intialize的時候會加載Provider


繼續是工廠類建立


其會建立出一個工廠類的方法出來。


這裏繼續下來是很酷的是建造者模式Buidler。

能夠看出Component的核心源碼系建造者模式。


這裏須要確立的是build必定是在inject以前的,先輸入參數建造才能注入。


Presenter是何時被初始化的呢?

咱們看到TaskActivity裏面注入Presenter


獲取taskPresenterModule的對象


TaskPresenter裏面構造


(1)關於tasksPresenterMembersInjector的獲取


咱們看到這裏初始化


而後在TaskPresenter_Factory經過get方法來獲取


這裏還涉及到一個Listeners的方法


其實現是在TasksPresenter裏面

(2)關於TaskDetailPresenter

TaskDetailPresenter的獲取是在TaskDetailActivity

這裏provideTaskIdProvider其引用是provideTaskId

provideTaskDetailContractViewProvider對應的是provideTaskDetailContractView


這裏聲明瞭FragmentScoped的定義域(Scope其定義是單例的定義域)

還有dependencies就是TaskRepositoryComponet的數據源來源


其getTasksRepositoryProvider 其提供者應該是getTasksRepository.


其實體對象獲取方式,是經過初始化的時候傳入TasksRepositoryComponent的實體


傳入數據提供實體


在自定義的Application中創建數據實體


(四).關於數據實體TasksRepository

咱們分爲近端和遠端數據

這裏@Qualifer是自定義命名的註解


本地註解

遠端註解

@聲明數據單例


初始化中帶有本地和遠端的註解對象


本地數據註解

遠端數據註解

在DaggerTasksRepositoryComponent中聯通這些註解對象


經過getTasksRepository獲取到實體到數據流實體


對象獲取

數據流實際初始化

設定經過單例@Singleton的方法獲取遠端和近端的數據


其單例的聲明是經過enum枚舉,而後聲明INSTANCE的方式,聲明單例的。


這裏特別說名一下一個沒有scope的組件component不能夠依賴一個有scope的組件component。子組件和父組件的scope不能相同。咱們一般的ApplicationComponent都會使用Singleton註解(),也就會是說咱們若是自定義component必須有本身的scope。


三.總結

Dagger2註解,框架最重要理解的就是依賴倒置的設計原則。

Dagger2源碼的套路

Module->Factory.create 工廠建立

Component-> XXXComponent.Bulider 建造者模式

Singleton Scoped-> 利用enum和INSTANCE標示 單例模式

理解這些設計模式,一旦你真的看懂Dagger2的設計模式,你會以爲Dagger2的設計很是精妙。能夠理解其Apt的註解編寫的設計真的很是值得學習,之後有機會會給你們分享Apt編寫代碼的一些詳解。



此次的源碼分析就到這裏

下一節應該會分析MVP +RXJava的源碼,敬請期待!!!

我創建了一個關於Android架構學習的羣,裏面能夠進一步進行組件化學習和架構思想的的交流。

羣號是316556016,也能夠掃碼進羣。我在這裏期待大家的加入!!!

相關文章
相關標籤/搜索