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

? ? ? ?不知不覺又是一年虽填,這一年恨樟,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)系和生命周期,都讓它來幫我們管理右犹。

接下來提澎,還有一幅圖,


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


那么念链,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 我想要使用這個對象(依賴)

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


@Inject 初步使用

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


@Component 初步使用

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

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

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


@Component 源碼

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

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


@Module的初步使用

我們將,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,里面,直接

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ù)文章會逐漸擴展,

如果這篇文章對您有開發(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)系作者
  • 序言:七十年代末贞岭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子搓侄,更是在濱河造成了極大的恐慌瞄桨,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讶踪,死亡現(xiàn)場離奇詭異芯侥,居然都是意外死亡,警方通過查閱死者的電腦和手機乳讥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門柱查,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人云石,你說我怎么就攤上這事唉工。” “怎么了汹忠?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵淋硝,是天一觀的道長雹熬。 經(jīng)常有香客問我,道長谣膳,這世上最難降的妖魔是什么竿报? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮参歹,結(jié)果婚禮上仰楚,老公的妹妹穿的比我還像新娘。我一直安慰自己犬庇,他們只是感情好僧界,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著臭挽,像睡著了一般捂襟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欢峰,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天葬荷,我揣著相機與錄音,去河邊找鬼纽帖。 笑死宠漩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的懊直。 我是一名探鬼主播扒吁,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼室囊!你這毒婦竟也來了雕崩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤融撞,失蹤者是張志新(化名)和其女友劉穎盼铁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尝偎,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡饶火,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了致扯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趁窃。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖急前,靈堂內(nèi)的尸體忽然破棺而出醒陆,到底是詐尸還是另有隱情,我是刑警寧澤裆针,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布刨摩,位于F島的核電站寺晌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏澡刹。R本人自食惡果不足惜呻征,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望罢浇。 院中可真熱鬧陆赋,春花似錦、人聲如沸嚷闭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胞锰。三九已至灾锯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗅榕,已是汗流浹背顺饮。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凌那,地道東北人兼雄。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像帽蝶,于是被迫代替她去往敵國和親赦肋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容