本文做者: 伯樂在線 - 牛犇 。未經做者許可,禁止轉載!
歡迎加入伯樂在線做者團隊。html
前言android
若是您對dagger2的概念,整個依賴注入框架還不清楚,能夠先了解下個人前2篇文章:git
《dagger2讓你愛不釋手:基礎依賴注入框架篇》
《dagger2讓你愛不釋手:重點概念講解、融合篇》github
這2篇文章也收到好多網友的好評和提問,謝謝你們的支持。我大概總結了下提的問題:編程
dagger2到底能帶來哪些好處?設計模式
dagger2怎麼使用?安全
所以我將結合這2點來進行本文的講解。而且會有具體的sample。網絡
我們直奔主題:架構
增長開發效率、省去重複的簡單體力勞動app
首先new一個實例的過程是一個重複的簡單體力勞動,dagger2徹底能夠把new一個實例的工做作了,所以咱們把主要精力集中在關鍵業務上、同時也能增長開發效率上。
省去寫單例的方法,而且也不須要擔憂本身寫的單例方法是否線程安全,本身寫的單例是懶漢模式仍是餓漢模式。由於dagger2均可以把這些工做作了。
更好的管理類實例
每一個app中的ApplicationComponent管理整個app的全局類實例,全部的全局類實例都統一交給ApplicationComponent管理,而且它們的生命週期與app的生命週期同樣。
每一個頁面對應本身的Component,頁面Component管理着本身頁面所依賴的全部類實例。
由於Component,Module,整個app的類實例結構變的很清晰。
解耦
假如不用dagger2的話,一個類的new代碼是很是可能充斥在app的多個類中的,假如該類的構造函數發生變化,那這些涉及到的類都得進行修改。設計模式中提倡把容易變化的部分封裝起來。
咱們用了dagger2後。
假如是經過用Inject註解標註的構造函數建立類實例,則即便構造函數變的天花亂墜,咱們基本上都不須要修改任何代碼。
假如是經過工廠模式Module建立類實例,Module其實就是把new類實例的代碼封裝起來,這樣即便類的構造函數發生變化,只須要修改Module便可。
有個網友問過一個這樣的問題,Module的構造函數也會發生變化,發生變化後,相應的new Module的類也發生變化,這就沒有達到解耦的效果。首先解耦不是說讓類之間或模塊之間真的一點關係都沒有了,解耦達到的目的是讓一個類或一個模塊對與本身有關聯的類或模塊的影響降到最低,不是說這種影響就徹底沒有了,這是不可能的。
解耦還有個好處,就是方便測試,若須要替換爲網絡測試類,只須要修改相應的Module便可。
具體的代碼就不講了,dagger2 sample地址,你們自行下載。這裏重點說下dagger2對目標類進行依賴注入的過程,如今假設要初始化目標類中的其中一個依賴類的實例,那具體步驟就在下面:
1 2 3 4 5 6 7 8 |
步驟1:查找Module中是否存在建立該類的方法。 步驟2:若存在建立類方法,查看該方法是否存在參數 步驟2.1:若存在參數,則按從**步驟1**開始依次初始化每一個參數 步驟2.2:若不存在參數,則直接初始化該類實例,一次依賴注入到此結束 步驟3:若不存在建立類方法,則查找Inject註解的構造函數, 看構造函數是否存在參數 步驟3.1:若存在參數,則從**步驟1**開始依次初始化每一個參數 步驟3.2:若不存在參數,則直接初始化該類實例,一次依賴注入到此結束 |
以上是dagger2進行的一次依賴注入的步驟,其實這個步驟是一個遞歸的過程,而且在查找類的實例的過程當中Module的級別要高於Inject,這概念在上一篇講過。
下面在說下注意的幾點
一個app必需要有一個Component(名字能夠是ApplicationComponent)用來管理app的整個全局類實例
多個頁面能夠共享一個Component
不是說Component就必定要對應一個或多個Module,Component也能夠不包含Module
自定義Scope註解最好使用上,雖然不使用也是可讓項目運行起來的,可是加上好處多多。
好了關於dagger2的全部的概念知識點到此終於結束了,但願能幫助你們,與你們共勉,有問題能夠隨時與我溝通。
問啊-定製化IT教育平臺,牛人一對一服務,有問必答,開發編程社交頭條 官方網站:www.wenaaa.com 下載問啊APP,參與官方懸賞,賺百元現金。
QQ羣290551701 彙集不少互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!