初识 Dagger 2

2022-01-25  本文已影响0人  raywalker

介绍

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

References

上一篇下一篇

猜你喜欢

热点阅读