Dagger - 快速依赖注入器(for android and java) (1)

前端之家收集整理的这篇文章主要介绍了Dagger - 快速依赖注入器(for android and java) (1)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

引言

在程序中, 最重要的类是那些真正实现功能的类:比如BarcodeDecoder(条形码解码器),KoopaPhysicsEngine(某某引擎),249)">AudioStreamer(音频流)。这些类往往有些依赖类, 比如BarcodeCameraFinder(条形码图形识别器),249)">DefaultPhysicsEngine(默认物理引擎),和HttpStreamer(http输出流).

相反, 程序中最不重要的类是辅助类(take up space without doing much at all): BarcodeDecoderFactory(条形码解析器工厂),CameraServiceLoader(相机服务加载器),和 MutableContextWrapper(易变环境变量包装器).这些辅助类就像笨拙的胶带一样,将那些重要的功能类连接起来。

Dagger 就是这些工厂类的终结者。 它帮助你专注在那些重要的功能类上。通过声明依赖关系, 指定规则, 构建整个应用程序。

Dagger 构建在标准的javax.injectannotation基础之上,每一个类都很容易测试。你也不需要为了便于将 RpcCreditCardService 替换为 FakeCreditCardService, 而构建一堆的样板(boilerplate)。

依赖注入Dependency injection)也并不是仅仅为了测试。 它可以使很容易创建 可复用、通用的Module。在整个应用程序中, 你可以共享同一个AuthenticationModule。你也可以在开发过程中使用DevLoggingModule,而在发布时使用ProdLoggingModule

更多信息请移步watch an introductory talk by Jesse Wilson at QCon 2012.

译者:
上文中有两个概念:
1. 依赖注入, Dependency injection. 也叫控制反转(IoC), 就是通过一定的规则管理对象间的依赖关系。详细概念参考wiki控制反转
2. 而Dagger组件则通过annotation实现了依赖注入。

Using Dagger

接下来, 我们通过构建一个Coffer Maker 来说明 依赖注入 和 Dagger。你可以下载完整的Coffee Maker示例代码, 编译调试。

声明依赖关系

Dagger 构造应用程序的类对象,并组合其依赖关系。 Dagger使用javax.inject.Injectannotation 标记那些构造函数和成员变量需要依赖注入。

Dagger将使用@Inject 注释的构造函数创建类对象。 当请求构建新的类对象时, Dagger 将自动获取相应的参数, 并调用构造函数

class Thermosiphon implements Pump {
  private final Heater heater;

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

Dagger 可以直接注入成员变量。在这个例子中, 它获取Heater对象, 并注入到成员变量heater,同时获取Pump对象并注入到成员变量pump。

CoffeeMaker { @Inject ; Pump pump; 当类中含有@Inject注释的成员变量, 却没有@Inject注释的构造函数时, Dagger将使用类的默认构造函数。若类中缺少@Inject注释, 该类是不能由Dagger创建的。

Dagger不支持函数注入。

译者:
若是某些类不需要Inject任何对象, 而又希望由Dagger创建该类对象。 这时, 应该至少添加一个@Inject的默认构造函数, 否则会报异常。

实现依赖关系

(Satisfying Dependencies, 实在想不出合适的中文对应)

默认情况下, Dagger 通过构造相应类型的对象来实现依赖关系。当请求一个CoffeMaker对象时, Dagger将调用new CoffeeMaker()构造函数, 并赋值给@Inject标记的成员变量。

但是@Inject并不是在任何情况下都可以: