初識(shí) Dagger 2

介紹

Dagger 2 也依照JSR 330 支持聲明注入點(diǎn)(injection sites)。Dagger 2中支持所有Dagger 1 支持的注入類(lèi)型(按字段和構(gòu)造方法注入),此外Dagger2 還支持方法注入(method injection),而不支持靜態(tài)注入(static injection)。對(duì)于范型class,Dagger 2 也不提供注入支持。

  • 構(gòu)造方法注入
class Thermosiphon implements Pump {
  private final Heater heater;

  @Inject
  Thermosiphon(Heater heater) {
    this.heater = heater;
  }
}

通過(guò)上面的注入聲明,在Dagger創(chuàng)建 Thermosiphon 實(shí)例時(shí),Dagger會(huì)獲取所需的構(gòu)造方法參數(shù),并調(diào)用該構(gòu)造方法來(lái)實(shí)現(xiàn)。

  • 字段注入
class CoffeeMaker {
  @Inject Heater heater;
  @Inject Pump pump;
}

與Dagger 1的異同

Module

Dagger 2 中的Module與Dagger 1 中的很類(lèi)似,但是減少了配置的復(fù)雜性。

Provides

Provides 注解與之前有著相同的語(yǔ)義。

Component 與 Builder

與Dagger1中不同的是,不必實(shí)例化ObjectGraph對(duì)象,而采取定義Component,在其中聲明關(guān)聯(lián)的Modules。同時(shí)定義Component.Builderinterface可以自定義Component的創(chuàng)建過(guò)程。

Component間的關(guān)系

Dagger1中使用objectGraph.plus(new ChildGraphModule()), 可以從現(xiàn)有的Graph中創(chuàng)建新的Graph;類(lèi)似的,Dagger2可以通過(guò)定義Subcomponent來(lái)實(shí)現(xiàn)。

@SubComponent(modules = {ChildGraphModule.class} )
interface MySubcomponent {
}

@Component
interface MyComponent {
  /* Functionally equivalent to objectGraph.plus(childGraphModule). */
  MySubcomponent plus(ChildGraphModule childGraphModule);
}
MySubcomponent mySubcomponent = myComponent.plus(new ChildGraphModule());

Scope

對(duì)應(yīng)不同的生命周期,可以聲明有不同生命周期的component(e.g. Android 中Application VS. Activity)。每個(gè)component可以通過(guò)修飾的scope注解關(guān)聯(lián)到特定的scope。組件的實(shí)現(xiàn)確保每個(gè)component的實(shí)例只有一種對(duì)應(yīng)的scope綁定相關(guān)聯(lián)。如果component聲明了一種scope,它就只能包含graph中沒(méi)有scope的綁定或是相同scope的綁定。

@Singleton  
@Component
interface MyApplicationComponent {
    // this component can only inject types using unscoped or @Singleton bindings
}

Android 上除去樣板代碼的優(yōu)化

在擴(kuò)展對(duì)Android支持后,如com.google.dagger:dagger-android:2.16中可以通過(guò)AndroidInjection.inject(activity)AndroidSupportInjection.inject(fragment) 注入Activity/Fragment中的依賴(lài)。

詳細(xì)示例可以參考 Google官方 demo Github Browser Sample。

Dagger Hilt

隨著 Dagger2 的演變,復(fù)雜度也隨之增長(zhǎng);特定于Android平臺(tái)上Google推出了基于Dagger2的 Hilt,用以簡(jiǎn)化Android app中的使用。限于篇幅,待下回分解吧。

References

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 點(diǎn)贊關(guān)注,不再迷路,你的支持對(duì)我意義重大!?? Hi,我是丑丑。本文 「Android 路線」| 導(dǎo)讀 —— 從零到...
    彭旭銳閱讀 1,386評(píng)論 2 5
  • 在 Android 應(yīng)用開(kāi)發(fā)中,手動(dòng)進(jìn)行依賴(lài)項(xiàng)的管理,可能會(huì)出現(xiàn)很多問(wèn)題,尤其是多人合作的項(xiàng)目,這些問(wèn)題會(huì)變得越來(lái)...
    mrzhqiang閱讀 411評(píng)論 0 0
  • Dagger2 1.依賴(lài)注入 (Dependency Injection) 1.1 面向接口編程 方式 1 中直接...
    Kip_Salens閱讀 804評(píng)論 0 2
  • Dagger2 依賴(lài)庫(kù) @Inject 注解 用來(lái)標(biāo)記依賴(lài)實(shí)例,如: 用來(lái)標(biāo)記可以直接創(chuàng)建的對(duì)象實(shí)例,如: @Mo...
    Android小悟空閱讀 1,728評(píng)論 0 1
  • 點(diǎn)贊關(guān)注,不再迷路,你的支持對(duì)我意義重大!?? Hi,我是丑丑。本文 「Android 路線」| 導(dǎo)讀 —— 從零到...
    彭旭銳閱讀 1,825評(píng)論 0 2

友情鏈接更多精彩內(nèi)容