? ? ? ?不知不覺又是一年虽填,這一年恨樟,Android技術(shù)與架構(gòu)依舊不斷推陳出新耻警,各種開源框架層出不窮拘央,非常感謝大Android市場為我們帶來的機遇與挑戰(zhàn)涂屁,可能是這一年Android市場的風(fēng)起云涌和以及各種新技術(shù)的沖擊,不得不要求自己去做一點什么.思來想去還是閑暇之余寫寫文章,可能是在項目中使用到的技術(shù)堪滨,亦或是優(yōu)秀的第三方開源框架的使用胯陋,亦或是一些讀書筆記,亦或是隨筆散文,在Android8.0來臨之際遏乔,希望自己可以堅持下來义矛,加油。
? ? ? ?網(wǎng)上關(guān)于Dagger2的講解使用其實非常詳細了盟萨,這里就簡單的介紹下Dagger的基本使用凉翻。Dagger,英譯中:匕首捻激、短劍的意思制轰,這是一款非常優(yōu)秀的“依賴注入”框架,(拓展:IOC胞谭,英文全稱:Inversion of Control垃杖,中文名稱:控制反轉(zhuǎn),它還有個名字叫依賴注入(Dependency Injection)丈屹。作用:將各層的對象以松耦合的方式組織在一起调俘,解耦,各層對象的調(diào)用完全面向接口旺垒。)關(guān)于具體的原理和邏輯彩库,仁者見仁智者見智。我理解的就是通過這個框架以接口這種形式去完成原來的new Object(),完成最終的解耦先蒋。
? ? ? ? 舉個例子骇钦,我們現(xiàn)在需要一個類叫Dog,Dog這個類中中需要持有一個叫Eat的對象,Eat中又需要持有Food對象,Ok,這還不簡單,胸有成竹瀟瀟灑灑就是如下代碼:
Dog dog = new Dog (new Eat (new ?Food()) );
但是在實際開發(fā)中,我們遇到的情況卻是這樣子的竞漾,
哦眯搭,上帝,我好像原來也是這樣寫的业岁,這樣一坨一坨的坦仍,看上去很相似吧,自己看自己寫的還好叨襟,要是遇見別人寫的(不寫注釋不寫備注寫的個個像混淆后似的)那就灰常老火了繁扎,這個時候,Dagger就像極了一個好人雙眼放光似地說道糊闽,new Object()那家強梳玫,免費干活不嫌累那家強?It's me! 簡而言之,Dagger只用專注于怎么實現(xiàn)功能,至于對象的依賴關(guān)系和生命周期,都讓它來幫我們管理右犹。
接下來提澎,還有一幅圖,
那么念链,Dagger2的鐵三角就來了:
1)Module 提供依賴盼忌,(類似經(jīng)濟學(xué)里面的供給方)
2)Component關(guān)聯(lián)依賴积糯,類似于一個容器,中間商(供給方---需求方谦纱,兩者聯(lián)系的橋梁),連接器
3)Container 使用依賴,(類似于經(jīng)濟學(xué)里面的需求方)
重要的注解:
1)@Inject 看成,在需要依賴(也就是需要具體的對象)時候使用這個注解,
2)@Module 跨嘉,這個里面的方法專門提供依賴川慌,用此注解的時候躏结,Dagger在構(gòu)造類的實例的時候就知道去那里找到需要的依賴呀闻,
3)@Provide 阳堕,這個注解渣锦,主要是用來提供依賴,(與@inject互相對應(yīng)颈抚,供給方or需求方一 一對應(yīng)的關(guān)系)
4)@Component 蝌借,連接的橋梁衙传,也稱為注入器嘱支,Dagger源代碼里面,此注解需要Module,本質(zhì)是一個interface,這個接口本身不提供實例對象,由注解@Component 后面的{}里面的.class去提供,
下面就開始正式使用Dagger2:
1)在? Module:app? builde.gradle
?apply plugin: 'com.android.application'的下面艾蓝,新增:
apply plugin: 'com.neenbedankt.android-apt'
(凡是這種通過構(gòu)建自動生成代碼的,基本上都要安裝插件)
2)在? Module:app? builde.gradle?
dependencies {
新增如下3行:
compile 'com.google.dagger:dagger:2.0.2' ?//依賴
compile 'com.google.dagger:dagger-compiler:2.0.2' ?//指定注解處理器
provided 'org.glassfish:javax.annotation:10.0-b28' //添加Android缺失部分的javax注解
}
3)在 ?Project:XXX ?builde.gradle
dependencies{
//新增下面一行
classpath'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
基本的Dagger配置就是上述步驟,然后同步一下開發(fā)工具.
第一篇的使用,我們來了解最基本的用法,我們就定義一個JavaBean,里面有個方法,用來打印日志
First ?,我們就有了如下代碼:
Second ?,我們在Activity里面使用這個JavaBean,調(diào)用里面的方法,傳統(tǒng)工藝告訴我們需要new 對象,然后調(diào)用其方法,
但是!!! 在Dagger里想使用一個具體的對象,如圖Dagger-1,使用@Inject 注解 告訴Dagger 我想要使用這個對象(依賴)
瀟瀟灑灑就有了以下的代碼,
接下來,依舊如圖Dagger-1,現(xiàn)在有了@Inject,(筆者是文科出身,這里引申一個經(jīng)濟學(xué)的理論,有了需求(@inject),也有了供給(@provide),但如何保證需求與供給平衡?大蕭條的慘痛經(jīng)驗告訴我們僅依靠市場規(guī)律是不行滴,兩者還需要政府的宏觀調(diào)控(也就是@Component)來把控全局),于是乎,我們定義一個@Component
關(guān)于這個inject()方法,方法參數(shù)為ManActivity斗塘,
我們先簡單的理解,就是聲明MainActivity這個類,用來指定這個@Component和@Module?
接著,我們點進去看,注解的源碼需要我們提供一個modules的依賴
需要注意的是,這個@Component本身不提供依賴,提供依賴的步驟是在{}花括號里面的.class文件去處理實例對象
Thirdly : ?接下來,我們就需要完成具體的@Moudle?
我們將,HttpModule這個類,以@Module注解標注,
告知Dagger2,我這個類是為了給使用到@Component,里面使用了(modules= {HttpMoudle.class})結(jié)合使用的
@Provide 這個注解在上文說的也很清楚了,這個與@Inject是直接對應(yīng)的,類似與之前提到的供給or需求的關(guān)系
圖上注解@Provide的這個方法,返回一個FirstUseDagger對象(恍然大悟, 我們之前的new 對象的方式 就在這里被替換完成了)
整體的代碼思路就是,
A-->聲明Module;
B-->在@Provides注解里面,返回對象;對外提供依賴
C-->整個Module的職責(zé)是給@Component提供一個對象供給倉庫
D-->在Container里面,使用Dagger2為我們提供的依賴
Fourthly:
代碼寫到這里,我們點擊同步(Sync now),或者編譯代碼,這個時候,Dagger的插件會為我們生成一些代碼,
我這里的@Component 使用的是HttpComponent,系統(tǒng)為我生成的是DaggerHttpComponent,由于我這里是第一篇,最基礎(chǔ)的,
那么,在我們的MainActivity,里面,直接
A-->用@Inject注解,告知Dagger2,我要使用(需求方)這個對象,
B-->我們思考傳統(tǒng)的寫法,如果沒有這個對象,如果對象名調(diào)用方法名()就直接拋空指針異常,
C-->在上文說到,Dagger2的對象提供由@Provide提供(供給方)去滿足new 對象
D-->兩者的橋梁由@Components鏈接對應(yīng)
E-->簡單的使用:DaggerXXXComponent.create().inject(this);
附上編譯后生成的源代碼:
由于是Dagger2的第一篇,所以也只是非常簡單的講解下概念,入門使用,后續(xù)文章會逐漸擴展,
如果這篇文章對您有開發(fā)or學(xué)習(xí)上的些許幫助,希望各位看官留下寶貴的star亮靴,謝謝馍盟。
Ps:著作權(quán)歸作者所有,轉(zhuǎn)載請注明作者, 商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處(開頭或結(jié)尾請?zhí)砑愚D(zhuǎn)載出處茧吊,添加原文url地址),文章請勿濫用,也希望大家尊重筆者的勞動成果