介紹
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.Builder的interface可以自定義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中的使用。限于篇幅,待下回分解吧。