介绍
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中的使用。限于篇幅,待下回分解吧。
网友评论