介紹
Dagger 2 也依照JSR 330 支持聲明注入點(injection sites)。Dagger 2中支持所有Dagger 1 支持的注入類型(按字段和構造方法注入),此外Dagger2 還支持方法注入(method injection),而不支持靜態注入(static injection)。對于范型class,Dagger 2 也不提供注入支持。
- 構造方法注入
class Thermosiphon implements Pump {
private final Heater heater;
@Inject
Thermosiphon(Heater heater) {
this.heater = heater;
}
}
通過上面的注入聲明,在Dagger創建 Thermosiphon
實例時,Dagger會獲取所需的構造方法參數,并調用該構造方法來實現。
- 字段注入
class CoffeeMaker {
@Inject Heater heater;
@Inject Pump pump;
}
與Dagger 1的異同
Module
Dagger 2 中的Module
與Dagger 1 中的很類似,但是減少了配置的復雜性。
Provides
Provides
注解與之前有著相同的語義。
Component 與 Builder
與Dagger1中不同的是,不必實例化ObjectGraph
對象,而采取定義Component
,在其中聲明關聯的Modules
。同時定義Component.Builder
的interface
可以自定義Component
的創建過程。
Component間的關系
Dagger1中使用objectGraph.plus(new ChildGraphModule())
, 可以從現有的Graph中創建新的Graph;類似的,Dagger2可以通過定義Subcomponent
來實現。
@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
對應不同的生命周期,可以聲明有不同生命周期的component(e.g. Android 中Application
VS. Activity
)。每個component可以通過修飾的scope注解關聯到特定的scope
。組件的實現確保每個component的實例只有一種對應的scope綁定相關聯。如果component聲明了一種scope,它就只能包含graph中沒有scope的綁定或是相同scope的綁定。
@Singleton
@Component
interface MyApplicationComponent {
// this component can only inject types using unscoped or @Singleton bindings
}
Android 上除去樣板代碼的優化
在擴展對Android支持后,如com.google.dagger:dagger-android:2.16
中可以通過AndroidInjection.inject(activity)
與 AndroidSupportInjection.inject(fragment)
注入Activity/Fragment中的依賴。
詳細示例可以參考 Google官方 demo Github Browser Sample。
Dagger Hilt
隨著 Dagger2 的演變,復雜度也隨之增長;特定于Android平臺上Google推出了基于Dagger2的 Hilt,用以簡化Android app中的使用。限于篇幅,待下回分解吧。