史上最適合新手的Dagger2教程(五)命名、限定與延時(shí)加載

Dagger2系列教程目錄:

史上最適合新手的Dagger2教程(一)基本注入

史上最適合新手的Dagger2教程(二)對(duì)象注入

史上最適合新手的Dagger2教程(三)模型與單例

史上最適合新手的Dagger2教程(四)帶參注入

史上最適合新手的Dagger2教程(五)命名虎眨、限定與延時(shí)加載

上節(jié)課我們講到蟋软,有些類(lèi)存在有參和無(wú)參兩種構(gòu)造方法镶摘,而這兩種構(gòu)造方法此時(shí)要用到同一個(gè)類(lèi)下,怎么辦岳守?


比如說(shuō)我們現(xiàn)在有一個(gè)計(jì)數(shù)器Counter凄敢,有帶參和不帶參兩種構(gòu)造方法:

public class Counter {
    private int sum;
    public Counter() {
    }
     public Counter(int sum) {
        this.sum = sum;
    }
     public int getSum() {
        return sum++;
    }
}

此時(shí)我要記錄本次打開(kāi)APP的計(jì)數(shù)和總計(jì)的計(jì)數(shù):

public class MainActivity extends AppCompatActivity {
    Counter currentCounter;
    Counter totalCounter;
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        currentCounter = new Counter();
        totalCounter = new Counter(10);
    }
}

水啦~

按照上節(jié)課的內(nèi)容,我們先把模型湿痢、提供者和注入器寫(xiě)好:

模型與提供者:

需要注意的是:同一個(gè)模型下的提供者的方法名不能雷同涝缝,無(wú)論參數(shù)是否相同。這個(gè)和常規(guī)的Java代碼有出入蒙袍,請(qǐng)牢記俊卤!

@Module
public class CounterMoudule {
    private int sum;
    public CounterMoudule(int sum) {
        this.sum = sum;
    }
     @Provides
    public int sumProvider() {
        return this.sum;
    }
     @Provides
    public Counter currentCounterProvider() {
        return new Counter();
    }
     @Provides
    public Counter totalCunterProvider(int sum) {
        return new Counter(sum);
    }
}

注入器:

@Component(modules = CounterMoudule.class)
public interface CounterComponent {
    void inject(MainActivity mainActivity);
}

接下來(lái),我們用兩種方式實(shí)現(xiàn)區(qū)分注入害幅。

1.命名(@Named)

Named,顧名思義——起名字岂昭,我們給這兩個(gè)不同的計(jì)數(shù)器起不同的名字以现,問(wèn)題自然迎刃而解。

@Named注釋標(biāo)記的是提供者使用對(duì)象

標(biāo)記提供者:

@Module
public class CounterMoudule {

      ......

    @Provides
    @Named("current")
    public Counter currentCounterProvider() {
        return new Counter();
    }
    @Provides
    @Named("total")
    public Counter totalCunterProvider(int sum) {
        return new Counter(sum);
    }
}

標(biāo)記使用對(duì)象:

public class MainActivity extends AppCompatActivity {
    @Named("current")
    @Inject
    Counter currentCounter;
    @Named("total")
    @Inject
    Counter totalCounter;
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DaggerCounterComponent.builder().counterMoudule(new CounterMoudule(10)).build().inject(this);

        Log.e("current", currentCounter.getSum() + "");
        Log.e("total", totalCounter.getSum() + "");
    }
}

運(yùn)行結(jié)果:

2.限定(@Qualifier)

Qualifier限定约啊,由于Named是通過(guò)匹配字符串作為區(qū)分條件邑遏,在大項(xiàng)目中顯得不夠嚴(yán)謹(jǐn),于是就有了限定這個(gè)注解恰矩。

@Qualifier注解標(biāo)記的是:自定義注解记盒,對(duì)Java注解方面的知識(shí)要求較高,不了解的同學(xué)可以先去學(xué)習(xí)一下Java自定義注解

自定義當(dāng)前計(jì)數(shù)器注解:

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentCounter {
}

自定義總計(jì)數(shù)器注解:

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface TotalCounter {
}

注意:被限定標(biāo)記的注解必須是運(yùn)行時(shí)注解外傅。

其余地方把@Named替換成自定義注解即可:

提供者:

@Module
public class CounterMoudule {

      ......

    @Provides
    @CurrentCounter
    public Counter currentCounterProvider() {
        return new Counter();
    }
     @Provides
    @TotalCounter
    public Counter totalCunterProvider(int sum) {
        return new Counter(sum);
    }
}

標(biāo)記使用對(duì)象:

public class MainActivity extends AppCompatActivity {
    @CurrentCounter
    @Inject
    Counter currentCounter;
    @TotalCounter
    @Inject
    Counter totalCounter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DaggerCounterComponent.builder().counterMoudule(new CounterMoudule(10)).build().inject(this);
        Log.e("current", currentCounter.getSum() + "");
        Log.e("total", totalCounter.getSum() + "");
    }
}

3.懶加載

最后纪吮,我們介紹一下Dagger2的大殺器!——智能懶加載萎胰。

懶加載碾盟,就是在需要的時(shí)候才對(duì)成員變量進(jìn)行初始化,這樣可以大幅縮短應(yīng)用初始化的時(shí)間技竟。

我們只要使用Lazy<T>修飾變量即可:

    @Inject
    Lazy<Object> object;

End.

Dagger2的所有基礎(chǔ)知識(shí)就在這里了冰肴,怎么樣,是不是非常簡(jiǎn)單呢榔组?

喜歡我教程風(fēng)格的朋友請(qǐng)不要客氣的關(guān)注一下嘛~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熙尉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子搓扯,更是在濱河造成了極大的恐慌检痰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擅编,死亡現(xiàn)場(chǎng)離奇詭異攀细,居然都是意外死亡箫踩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)谭贪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)境钟,“玉大人,你說(shuō)我怎么就攤上這事俭识】鳎” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵套媚,是天一觀的道長(zhǎng)缚态。 經(jīng)常有香客問(wèn)我,道長(zhǎng)堤瘤,這世上最難降的妖魔是什么玫芦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮本辐,結(jié)果婚禮上桥帆,老公的妹妹穿的比我還像新娘。我一直安慰自己慎皱,他們只是感情好老虫,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著茫多,像睡著了一般祈匙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上天揖,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天夺欲,我揣著相機(jī)與錄音,去河邊找鬼宝剖。 笑死洁闰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的万细。 我是一名探鬼主播扑眉,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赖钞!你這毒婦竟也來(lái)了腰素?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤雪营,失蹤者是張志新(化名)和其女友劉穎弓千,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體献起,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洋访,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年镣陕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姻政。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呆抑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汁展,到底是詐尸還是另有隱情鹊碍,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布食绿,位于F島的核電站侈咕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏器紧。R本人自食惡果不足惜耀销,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望品洛。 院中可真熱鬧树姨,春花似錦、人聲如沸桥状。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辅斟。三九已至,卻和暖如春芦拿,著一層夾襖步出監(jiān)牢的瞬間士飒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工蔗崎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酵幕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓缓苛,卻偏偏與公主長(zhǎng)得像芳撒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子未桥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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