Android依賴注入框架Dagger2的學(xué)習(xí)


在寫作業(yè)項(xiàng)目的時(shí)候了解了一下安卓中的一些常用框架提针,然后發(fā)現(xiàn)了現(xiàn)在實(shí)際項(xiàng)目中很常見的Dagger2框架,于是對(duì)其進(jìn)行了一些學(xué)習(xí)曹傀,下面分享一下我的學(xué)習(xí)體會(huì)

什么是Dagger2

Dagger2是一個(gè)Android中依賴注入的框架辐脖,依賴注入大家應(yīng)該都很熟悉了在用Spring進(jìn)行開發(fā)時(shí)應(yīng)該經(jīng)常會(huì)碰到。簡(jiǎn)單來(lái)說(shuō)就是經(jīng)常出現(xiàn)需要在一個(gè)對(duì)象里去創(chuàng)建另一個(gè)對(duì)象的情況卖毁,類之間相互依賴產(chǎn)生耦合導(dǎo)致代碼難以維護(hù)揖曾。Dagger2就是通過(guò)注解的方式落萎,把已經(jīng)初始化好的類的實(shí)例注入到目標(biāo)類中

在安卓應(yīng)用中使用Dagger2

引入Dagger2

配置Dagger2要在gradle中加入依賴
project的gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'
        //加上下面這個(gè)亥啦,因?yàn)闀?huì)用到apt
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

app的gradle:

dependencies {
    compile 'com.google.dagger:dagger:2.9'
    apt 'com.google.dagger:dagger-compiler:2.9'
}

使用Dagger2的注解

Dagger2中常用的注解一共有4個(gè):@Inject,@Provides练链,@Module翔脱,@Component。這部分剛開始看的很懵逼媒鼓,感覺非辰煊酰混亂,用一張圖簡(jiǎn)要描述一下(個(gè)人覺得參考文獻(xiàn)1的圖非常的通俗易懂绿鸣,感興趣的同學(xué)可以參考那篇博文

此處輸入圖片的描述
此處輸入圖片的描述

  • @Inject
    @Inject就是用來(lái)標(biāo)注要依賴的類疚沐。一處用在被依賴的類的構(gòu)造函數(shù),一處用在目標(biāo)類中被依賴的類的對(duì)象實(shí)例處潮模。
  • @Component
    @Component就是在@Inject標(biāo)注的被依賴類的實(shí)例和構(gòu)造函數(shù)間搭起了橋梁亮蛔。大概的工作過(guò)程就是:Component會(huì)查找目標(biāo)類中用Inject注解標(biāo)注的屬性,查找到相應(yīng)的屬性后會(huì)接著查找該屬性對(duì)應(yīng)的用Inject標(biāo)注的構(gòu)造函數(shù)擎厢,然后初始化該屬性的實(shí)例并把實(shí)例進(jìn)行賦值究流,通過(guò)inject方法注入辣吃。
  • @Module
    @Module也是用來(lái)標(biāo)注依賴的,但是@Inject需要標(biāo)注在構(gòu)造函數(shù)上芬探,對(duì)于一些不能修改的第三方類庫(kù)等就可以用@Module來(lái)標(biāo)注神得,基本形式見下
@Module
    public class ModuleClass{
          //A是第三方類庫(kù)中的一個(gè)類,通常Module使用provide的方法名
          A provideA(){
               return A();
          }
    }
  • @Provides
    @Provides和上面的@Module一起解決第三方類庫(kù)依賴注入的,用@Provides標(biāo)注Module中的provide方法偷仿。然后Component在搜索到目標(biāo)類中用Inject注解標(biāo)注的屬性后哩簿,Component就會(huì)去Module中去查找用Provides標(biāo)注的對(duì)應(yīng)的創(chuàng)建類實(shí)例方法進(jìn)行注入。

一個(gè)簡(jiǎn)單的實(shí)例

下面用一個(gè)簡(jiǎn)單的例子來(lái)加深理解

public class MainActivity extends AppCompatActivity implements MainContract.View {
    @Inject
    MainPresenter mainPresenter;
    ...

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

         DaggerMainComponent.builder()
                .mainModule(new MainModule(this))
                .build()
                .inject(this);
        //調(diào)用Presenter方法加載數(shù)據(jù)
         mainPresenter.loadData();

         ...
    }

}

public class MainPresenter {
    private MainContract.View mView;

    @Inject
    MainPresenter(MainContract.View view) {
        mView = view;
    }    
    public void loadData() {
        //調(diào)用model層方法酝静,加載數(shù)據(jù)
        ...
        //回調(diào)方法成功時(shí)
        mView.updateUI();
    }

@Module
public class MainModule {
    private final MainContract.View mView;

    public MainModule(MainContract.View view) {
        mView = view;
    }

    @Provides
    MainView provideMainView() {
        return mView;
    }
}

@Component(modules = MainModule.class)
public interface MainComponent {
    void inject(MainActivity activity);
}

上面的注入過(guò)程大概就是:首先MainActivity需要依賴MainPresenter卡骂,因此用@Inject對(duì)MainPresenter進(jìn)行標(biāo)注,表明這是要注入的類形入。然后全跨,我們對(duì)MainPresenter的構(gòu)造函數(shù)也添加注解@Inject,此時(shí)構(gòu)造函數(shù)里有一個(gè)參數(shù)MainContract.View說(shuō)明MainPresenter需要依賴MainContract.View亿遂,所以我們定義了一個(gè)類浓若,叫做MainModule,提供一個(gè)方法provideMainView來(lái)提供這個(gè)依賴蛇数,這個(gè)MainView是通過(guò)MainModule的構(gòu)造函數(shù)注入進(jìn)來(lái)的挪钓,接著我們需要定義Component接口類,并將Module包含進(jìn)來(lái)耳舅,最后通過(guò)

DaggerMainComponent.builder()
                .mainModule(new MainModule(this))
                .build()
                .inject(this);

完成注入


參考文獻(xiàn):
Android:dagger2讓你愛不釋手-基礎(chǔ)依賴注入框架篇
依賴注入神器:Dagger2詳解系列
Dagger2從入門到放棄再到恍然大悟

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碌上,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子浦徊,更是在濱河造成了極大的恐慌馏予,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盔性,死亡現(xiàn)場(chǎng)離奇詭異霞丧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)冕香,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門蛹尝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人悉尾,你說(shuō)我怎么就攤上這事突那。” “怎么了构眯?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵愕难,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)务漩,這世上最難降的妖魔是什么拄衰? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮饵骨,結(jié)果婚禮上翘悉,老公的妹妹穿的比我還像新娘。我一直安慰自己居触,他們只是感情好妖混,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著轮洋,像睡著了一般制市。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弊予,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天祥楣,我揣著相機(jī)與錄音,去河邊找鬼汉柒。 笑死误褪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碾褂。 我是一名探鬼主播兽间,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼正塌!你這毒婦竟也來(lái)了嘀略?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乓诽,失蹤者是張志新(化名)和其女友劉穎帜羊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體问裕,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逮壁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粮宛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卖宠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情僧凰,我是刑警寧澤窒百,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響鳖宾,放射性物質(zhì)發(fā)生泄漏吼砂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一鼎文、第九天 我趴在偏房一處隱蔽的房頂上張望渔肩。 院中可真熱鬧,春花似錦拇惋、人聲如沸周偎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蓉坎。三九已至,卻和暖如春胡嘿,著一層夾襖步出監(jiān)牢的瞬間蛉艾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工衷敌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伺通,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓逢享,卻偏偏與公主長(zhǎng)得像罐监,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞒爬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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