Android-Dagger2使用--1(原創(chuàng))

? ? ? ?不知不覺又是一年,這一年,Android技術(shù)與架構(gòu)依舊不斷推陳出新,各種開源框架層出不窮,非常感謝大Android市場為我們帶來的機(jī)遇與挑戰(zhàn),可能是這一年Android市場的風(fēng)起云涌和以及各種新技術(shù)的沖擊,不得不要求自己去做一點什么.思來想去還是閑暇之余寫寫文章,可能是在項目中使用到的技術(shù),亦或是優(yōu)秀的第三方開源框架的使用,亦或是一些讀書筆記,亦或是隨筆散文,在Android8.0來臨之際,希望自己可以堅持下來,加油。

? ? ? ?網(wǎng)上關(guān)于Dagger2的講解使用其實非常詳細(xì)了,這里就簡單的介紹下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()那家強(qiáng),免費干活不嫌累那家強(qiáng)?It's me! 簡而言之,Dagger只用專注于怎么實現(xiàn)功能,至于對象的依賴關(guān)系和生命周期,都讓它來幫我們管理。

接下來,還有一幅圖,


(此UIM圖方便后面使用,稱為Dagger-1)


那么,Dagger2的鐵三角就來了:

1)Module 提供依賴,(類似經(jīng)濟(jì)學(xué)里面的供給方)

2)Component關(guān)聯(lián)依賴,類似于一個容器,中間商(供給方---需求方,兩者聯(lián)系的橋梁),連接器

3)Container 使用依賴,(類似于經(jīng)濟(jì)學(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 我想要使用這個對象(依賴)

瀟瀟灑灑就有了以下的代碼,


@Inject 初步使用

接下來,依舊如圖Dagger-1,現(xiàn)在有了@Inject,(筆者是文科出身,這里引申一個經(jīng)濟(jì)學(xué)的理論,有了需求(@inject),也有了供給(@provide),但如何保證需求與供給平衡?大蕭條的慘痛經(jīng)驗告訴我們僅依靠市場規(guī)律是不行滴,兩者還需要政府的宏觀調(diào)控(也就是@Component)來把控全局),于是乎,我們定義一個@Component


@Component 初步使用

關(guān)于這個inject()方法,方法參數(shù)為ManActivity,

我們先簡單的理解,就是聲明MainActivity這個類,用來指定這個@Component和@Module?

接著,我們點進(jìn)去看,注解的源碼需要我們提供一個modules的依賴


@Component 源碼

需要注意的是,這個@Component本身不提供依賴,提供依賴的步驟是在{}花括號里面的.class文件去處理實例對象

Thirdly : ?接下來,我們就需要完成具體的@Moudle?


@Module的初步使用

我們將,HttpModule這個類,以@Module注解標(biāo)注,

告知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,里面,直接

Dagger簡單使用

A-->用@Inject注解,告知Dagger2,我要使用(需求方)這個對象,

B-->我們思考傳統(tǒng)的寫法,如果沒有這個對象,如果對象名調(diào)用方法名()就直接拋空指針異常,

C-->在上文說到,Dagger2的對象提供由@Provide提供(供給方)去滿足new 對象

D-->兩者的橋梁由@Components鏈接對應(yīng)

E-->簡單的使用:DaggerXXXComponent.create().inject(this);

附上編譯后生成的源代碼:


編譯后的DaggerXXXComponet源代碼(部分)

由于是Dagger2的第一篇,所以也只是非常簡單的講解下概念,入門使用,后續(xù)文章會逐漸擴(kuò)展,

如果這篇文章對您有開發(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地址),文章請勿濫用,也希望大家尊重筆者的勞動成果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容