Dagger2 使用總結(jié)(二)

接著上一篇Dagger2 使用總結(jié)(一)繼續(xù)總結(jié)Dagger2的使用方法芋簿。

Component接口的復(fù)用


我們可以適當(dāng)?shù)貜?fù)用Component接口灰署,從而使邏輯更加簡潔且減少不必要的重復(fù)工作润樱,復(fù)用一般使用dependencies或者@Subcomponent瑰剃,這兩者比較相似歪沃,要注意區(qū)分臣淤,先看實(shí)現(xiàn)再總結(jié)吧:

依賴 dependencies

場景:現(xiàn)在有Vegetable抽象類和其兩個(gè)子類TomatoPotato橄霉,項(xiàng)目中可能較多地方都需要注入這兩個(gè)類的對象。
這時(shí)候我們可以建立BaseComponent接口邑蒋,其他需要使用這兩個(gè)對象的Component接口依賴于這個(gè)BaseComponent接口即可注入這兩個(gè)對象姓蜂,如下:

  • 新建VegetableTomato医吊、PotatoVegetableModule
public abstract class Vegetable {
    public abstract void print();
}
public class Tomato extends Vegetable{
    @Override
    public void print() {
        Log.d(TAG, "This is a tomato");
    }
}
public class Potato extends Vegetable {
    @Override
    public void print() {
        Log.d(TAG,"This is a potato");
    }
}
@Module
public class VegetableModule {

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

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

    @Provides
    @ProvideTomato
    Vegetable provideTomato() {
        return new Tomato();
    }

    @Provides
    @ProvidePotato
    Vegetable providePotato() {
        return new Potato();
    }
}

?
這些實(shí)現(xiàn)和注解在上一篇文章中都有說明钱慢,如果不了解可以回去翻一下。

  • 新建BaseComponent接口
@Component (modules = VegetableModule.class)
public interface BaseComponent {
    @VegetableModule.ProvideTomato Vegetable getTomato();
    @VegetableModule.ProvidePotato Vegetable getPotato();
}

在這里使用getXXX方法可以暴露這個(gè)接口可以獲得的對象卿堂,以使依賴其的接口可以獲得該對象束莫,如果不需要暴露則可不要編寫getXXX方法以保持邏輯嚴(yán)謹(jǐn)。比如如果不需要暴露Potato對象草描,可以將getPotato()方法刪除览绿,這樣即便依賴了BaseComponent接口,也無法獲得Potato對象穗慕。
現(xiàn)在可以編譯項(xiàng)目以使build目錄下生成相關(guān)文件饿敲。

  • MainActivity中實(shí)現(xiàn)依賴和注入
@Inject //屬性注入對象
@VegetableModule.ProvideTomato
public Vegetable tomato;

@Inject //屬性注入對象
@VegetableModule.ProvidePotato
public Vegetable potato;

@Component (dependencies = BaseComponent.class)  //這里使用了dependencies依賴了BaseComponent接口
interface MainActivityComponent {
    void inject(MainActivity activity);
}

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

    DaggerMainActivity_MainActivityComponent
            .builder()
            .baseComponent(DaggerBaseComponent.builder().build())  //依賴的接口要在這里配置下
            .build()
            .inject(this);
    tomato.print();
    potato.print();
}

這樣就省去了直接編寫Component接口的實(shí)現(xiàn),直接使用dependencies依賴即可逛绵。這種依賴方式的特點(diǎn)是可以實(shí)現(xiàn)暴露出的接口怀各,同時(shí)自身也可以擴(kuò)展自己的實(shí)現(xiàn)栗竖。

  • 拓展

依賴關(guān)系也可以實(shí)現(xiàn)多依賴,容易理解就不解釋了渠啤,看代碼:

@Component (dependencies = {BaseComponent.class, OtherComponent.class})  //多依賴
interface MainActivityComponent {
    void inject(MainActivity activity);
}

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

    DaggerMainActivity_MainActivityComponent
            .builder()
            .baseComponent(DaggerBaseComponent.builder().build())
            .otherComponent(DaggerOtherComponent.builder().build())  //這里注意也要配置下
            .build()
            .inject(this);
    tomato.print();
    potato.print();
}

?

@Subcomponent

dependencies區(qū)別在于狐肢,不需要父Component暴露出接口,也可以直接注入父Component中可注入的對象沥曹,有點(diǎn)像繼承關(guān)系份名。
為方便對比,還是剛剛的例子妓美,看看代碼實(shí)現(xiàn):

  • 新建Vegetable僵腺、TomatoPotatoVegetableModule

同上例壶栋。

  • 新建BaseComponent
@Component (modules = VegetableModule.class)
public interface BaseComponents {
    MainActivityComponent plus();  //這里加一個(gè)返回SubComponent的方法
}
  • 實(shí)現(xiàn)SubComponent
@Subcomponent (modules = FruitModule.class)  //這里的@Subcomponent表示這是一個(gè)SubComponent接口
public interface MainActivityComponent {
    void inject(MainActivity activity);
}
  • MainActivity注入對象
DaggerDagger2Components_BaseComponents
            .builder()
            .build()
            .plus()  //這里返回MainActivityComponent
            .inject(this);

這里只列出改變的地方辰如,其他代碼同上例。

總結(jié)

dependencies@SubComponent都是實(shí)現(xiàn)了Component接口的復(fù)用贵试,使用dependencies需要在父Component中暴露出需要注入的類(比如getXXX)琉兜,而使用@SubComponent不需要暴露類,而需要直接提供一個(gè)獲取SubComponent的方法毙玻。

為避免混亂豌蟋,建議一個(gè)模塊僅使用一種復(fù)用方式:

  • dependencies適用于部分父Component中對象需要對子Component隱藏,或者公共注入類不多的情況桑滩。
  • @SubComponent適用于父Component中公共注入類較多且不用隱藏的場景梧疲。

@Scope和@Singleton注解


我們可以用@Scope管理注入類的作用域,@Singleton@Scope的默認(rèn)實(shí)現(xiàn)方式运准。
待補(bǔ)充幌氮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市胁澳,隨后出現(xiàn)的幾起案子该互,更是在濱河造成了極大的恐慌,老刑警劉巖听哭,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慢洋,死亡現(xiàn)場離奇詭異,居然都是意外死亡陆盘,警方通過查閱死者的電腦和手機(jī)普筹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隘马,“玉大人太防,你說我怎么就攤上這事。” “怎么了蜒车?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵讳嘱,是天一觀的道長。 經(jīng)常有香客問我酿愧,道長沥潭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任嬉挡,我火速辦了婚禮钝鸽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庞钢。我一直安慰自己拔恰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布基括。 她就那樣靜靜地躺著颜懊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪风皿。 梳的紋絲不亂的頭發(fā)上河爹,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音揪阶,去河邊找鬼昌抠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鲁僚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播裁厅,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冰沙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了执虹?” 一聲冷哼從身側(cè)響起拓挥,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袋励,沒想到半個(gè)月后侥啤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茬故,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年盖灸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磺芭。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赁炎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钾腺,到底是詐尸還是另有隱情徙垫,我是刑警寧澤讥裤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站姻报,受9級特大地震影響己英,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吴旋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一剧辐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邮府,春花似錦荧关、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仙辟,卻和暖如春同波,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叠国。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工未檩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粟焊。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓冤狡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親项棠。 傳聞我的和親對象是個(gè)殘疾皇子悲雳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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