你們好,我是蒼王。
android
如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。設計模式
[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表架構
相信有關注個人人,都會看過我第一編介紹的Todo-mvp源碼體驗,這是基礎編。
app
這一章的難度理解難度將會很是大。框架
這個系列的課程適合研發有Android有一年半左右的同窗參考。ide
基於工做的問題,大型公司其實都不怎麼使用這種注入框架,而是直接用代碼完成解耦的。可是學習期框架架構,對咱們瞭解註解的使用和構建學習一些設計模式有着重要的做用。Dagger的設計的確很是精妙。源碼分析
估計不少新手看Dagger2都會看到一頭霧水,由於Dagger2使用的依賴反轉的設計模式原則。組件化
舉個例子,我去買東西,告訴老闆我須要什麼品類的東西,老闆就說你等着,我拿給你就行了。學習
這個部分都是老闆幫咱們完成了。ui
推薦一個很是好的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去作。
咱們看自定義的ToDoApplication,能夠簡單到看到mRepositoryComponnet是數據源在這裏聲明爲全局的變量
這裏會引用到自定義的ApplicationModule實體類,外面的變量經過provideContext獲取ApplicationContext參數。
咱們這裏先以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裏面構造
咱們看到這裏初始化
而後在TaskPresenter_Factory經過get方法來獲取
這裏還涉及到一個Listeners的方法
其實現是在TasksPresenter裏面
TaskDetailPresenter的獲取是在TaskDetailActivity
這裏provideTaskIdProvider其引用是provideTaskId
provideTaskDetailContractViewProvider對應的是provideTaskDetailContractView
這裏聲明瞭FragmentScoped的定義域(Scope其定義是單例的定義域)
還有dependencies就是TaskRepositoryComponet的數據源來源
其getTasksRepositoryProvider 其提供者應該是getTasksRepository.
其實體對象獲取方式,是經過初始化的時候傳入TasksRepositoryComponent的實體
傳入數據提供實體
在自定義的Application中創建數據實體
咱們分爲近端和遠端數據
這裏@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,也能夠掃碼進羣。我在這裏期待大家的加入!!!