2019-07-18

Dagger 入門

Dagger簡(jiǎn)介

Dagger2是Google提供的依賴注入框架配名,依賴注入為Android中組件之間的解耦提供了很好的解決方案。 使用它可以自動(dòng)生成創(chuàng)建依賴關(guān)系所需要的代碼晋辆。減少很多模板化的代碼渠脉,更易于測(cè)試,降低耦合瓶佳,創(chuàng)建可復(fù)用可互換的模塊芋膘。已經(jīng)在越來越多的開源項(xiàng)目中被使用,其已經(jīng)發(fā)展成為未來的一個(gè)技術(shù)趨勢(shì)霸饲。

Dagger中基礎(chǔ)注釋解釋

@Inject:翻譯為注入为朋,該注解在javax包中,不是Dagger獨(dú)有的注解厚脉,在Dagger中作用于構(gòu)造方法和字段中潜腻,作用在構(gòu)造方法中會(huì)解析生成一個(gè)類的工廠模板對(duì)象,表示提供該類的實(shí)例器仗,作用在字段中表示創(chuàng)建一個(gè)對(duì)象得到一個(gè)對(duì)象實(shí)例融涣。

@Component:翻譯為組件,在Dagger中@Component的作用就是關(guān)聯(lián)精钮,比如我們Activity中需要一個(gè)Goods商品對(duì)象威鹿,而如果只用
@Inject是不行的,因?yàn)?br> @Inject作用在Goods的構(gòu)造方法中的時(shí)候轨香,只是提供了一個(gè)工廠類忽你,而作用在Acivity的字段也只是告訴解釋器Activity需要這個(gè)對(duì)象卻沒有進(jìn)行關(guān)聯(lián)操作,@Component會(huì)為程序生成一個(gè)提供Activity和Goods工廠類相關(guān)聯(lián)的管道的類臂容。沒有Component編輯的時(shí)候不會(huì)報(bào)錯(cuò)科雳,但是對(duì)象肯定是null的。

@Module:模塊脓杉,作用在類中糟秘,是為了解決@Inject的局限性而Dagger加入的獨(dú)有注解,也是為生成對(duì)象而生的球散,他配合@Provides使用尿赚,還有就是用來區(qū)分模塊,比如網(wǎng)絡(luò)、db凌净、Sp等都有自己需要生成的類悲龟,我們總能放在一個(gè)類中吧,他跟@Provides是一對(duì)多的關(guān)系冰寻,@Provides不能脫離他實(shí)現(xiàn)须教,否則會(huì)報(bào)錯(cuò)。

@Provides:提供類斩芭,只能作用在方法中轻腺,不能作用在沒有@Module注解的類的方法中,否則會(huì)報(bào)錯(cuò):Error:(18, 18) 錯(cuò)誤: @Provides methods can only be present within a @Module or @ProducerModule秒旋,其作用跟@Inject一樣也是生成工廠類。

基本概念

Dagger 是通過@Inject使用具體的某個(gè)對(duì)象诀拭,這個(gè)對(duì)象呢迁筛,是由@Provides注解提供,但是呢耕挨,這個(gè)@Provides只能在固定的模塊中细卧,也就是@Module注解,我們查找的時(shí)候筒占,不是直接去找模塊贪庙,而是去找@Component

如何使用Dagger

avatar
引入依賴庫
//在項(xiàng)目的build.gradle文件中添加
 compile 'com.google.dagger:dagger:2.11'
 annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
創(chuàng)建Module
@Module 
public class MainModule {
}

創(chuàng)建具體的示例

public class A{
    public void eat(){
    Log.e("wyl","吃飯");
}
//第一步 添加@Module 注解
@Module
public class MainModule {
    //第二步 使用Provider 注解 實(shí)例化對(duì)象
    @Provides
    A providerA() {
        return new A();
    }
創(chuàng)建一個(gè)Component
//第一步 添加@Component
//第二步 添加module
@Component(modules = {MainModule.class})
public interface MainComponent {
    //第三步  寫一個(gè)方法 綁定Activity /Fragment
    void inject(MainActivity activity);
}
Rebuild Project

avatar

然后AS 會(huì)自動(dòng)幫我們生成

avatar
將Component與Activity/Fragment綁定關(guān)系
package com.allens.daggerdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.allens.daggerdemo.Bean.A;
import com.allens.daggerdemo.component.DaggerMainConponent;
import javax.inject.Inject;

public class MainActivity extends AppCompatActivity {
    /***
     * 第二步  使用Inject 注解翰苫,獲取到A 對(duì)象的實(shí)例
     */
    @Inject
    A a;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /***
         * 第一步 添加依賴關(guān)系
         */
        //第一種方式
        DaggerMainConponent.create().inject(this);

        //第二種方式
        DaggerMainConponent.builder().build().inject(this);

        /***
         * 第三步  調(diào)用A 對(duì)象的方法
         */
        a.eat();
    }
}

  

以上為Dagger的簡(jiǎn)單使用止邮,有人肯定會(huì)說為了在activity中獲取到A對(duì)象,繞這么一個(gè)大彎太麻煩了奏窑,如果在多個(gè)類中引用了A對(duì)象导披,按照之前的方式獲取A對(duì)象的引用得通過new A()來獲取,如果A類構(gòu)造函數(shù)對(duì)應(yīng)有變化埃唯,是不是引用A類的每個(gè)類都得做相應(yīng)修改撩匕,如果用Dagger來管理對(duì)象,減低耦合度墨叛,避免牽一發(fā)而動(dòng)全身止毕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市漠趁,隨后出現(xiàn)的幾起案子扁凛,更是在濱河造成了極大的恐慌,老刑警劉巖闯传,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件令漂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叠必,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門荚孵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纬朝,你說我怎么就攤上這事收叶。” “怎么了共苛?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵判没,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我隅茎,道長(zhǎng)澄峰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任辟犀,我火速辦了婚禮俏竞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堂竟。我一直安慰自己魂毁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布出嘹。 她就那樣靜靜地躺著席楚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪税稼。 梳的紋絲不亂的頭發(fā)上烦秩,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音郎仆,去河邊找鬼闻镶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丸升,可吹牛的內(nèi)容都是我干的铆农。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼狡耻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼墩剖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夷狰,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤岭皂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后沼头,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爷绘,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡书劝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了土至。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片购对。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖陶因,靈堂內(nèi)的尸體忽然破棺而出骡苞,到底是詐尸還是另有隱情,我是刑警寧澤楷扬,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布解幽,位于F島的核電站,受9級(jí)特大地震影響烘苹,放射性物質(zhì)發(fā)生泄漏躲株。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一镣衡、第九天 我趴在偏房一處隱蔽的房頂上張望霜定。 院中可真熱鬧,春花似錦捆探、人聲如沸然爆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奴烙,卻和暖如春助被,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背切诀。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工揩环, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人幅虑。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓丰滑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親倒庵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褒墨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349