匕首到底是什么,它是如何工作的

What is dagger exactly, and how it works

我知道这可能不是正确的提问方式,但在阅读了很多之后,我仍然对匕首及其工作原理以及我们为什么要使用它感到困惑。因为它被用在我目前的工作项目中。请有人用简单的话给我一些提示,匕首的用途是什么,这将非常有帮助。

Dagger 是一个编译时 JSR-330 依赖注入框架,基于Java 注释.

什么是依赖注入?

Dependency injection(有时称为控制反转或 IoC)基于这样的想法,即给定的 class 不需要知道如何创建或提供 classes 它取决于。提供这些依赖项应该是 class 的用户(或单独的 class 或工厂)的责任。

例如,假设您有 class A 取决于 class B,这取决于 classes CD。 (实际上,这可能是一个应用程序,它依赖于 BusinessLogicClass,依赖于计算器和数据库。)它可能看起来像这样:

class A {
  private B b = new B();
}
class B {
  private C c = new C();
  private D d = new D();
}

...但到那时,使用不同的 C 或 D(计算器或数据库)真的很难,即使你的 B(业务逻辑 class)也应该使用各种数据源,或者如果您需要更换任何这些部件以进行单元测试。依赖注入,作为一个概念,表示您应该能够在创建它们时将依赖项传递到 classes 中。

A a = new A(new B(new C(), new D())); // Now you get an A, but can replace any part of it.

什么是依赖注入框架?

依赖项注入框架会自动为您的所有 classes 创建工厂,因此您可以创建一个 A 而无需担心其依赖项或依赖项的依赖项。

A a = new AFactory().getA(); // Equivalent to the above, but easier!

依赖注入框架通常带有一种语言供您指定映射,通常称为 bindings,这只是指示您应该创建一个 EImpl当 class 要求 EInterfaceFSubclass 当 class 要求 FClass 时。这种语言还允许您选择何时创建新实例:在每次请求时,在整个应用程序中创建一次 ("singleton"),或以其他方式创建。 Spring uses XML and Guice 为此使用自定义 Java class 语言; Dagger 使用 Java 接口、classes 和注释。

你可以在没有容器或框架的情况下进行依赖注入,但大多数时候当你提到依赖注入时,人们会想到像 Spring、Guice 或 Dagger 这样的框架。这些框架自动消除了您在上面看到的许多 new 样板,否则可能会使 "manual" 依赖注入难以使用。

JSR 330 怎么样?

Java 将一些接口和注释标准化为 "JSR 330" 以便更容易在依赖注入框架之间切换,并使编写可在任何框架中工作的库变得容易。与Spring和Guice一样,Dagger符合这个标准。

为什么 Dagger 是编译时的?

其他依赖注入框架,包括 Spring 和 Guice,在 运行时进行配置 :它们使用 Java 反射来检查 class es 的构造函数、方法和字段。这在服务器和台式机上的生产中可能会很慢,并且由于 VM 差异和移动 processor/memory 限制,在 Android 上非常慢。因此,Square 和 Google 的团队编写了 Dagger 和 Dagger 2 以使用 Java annotation processing 在编译时检查 classes 并自动为纯 [=68] 编写标准 Java 代码=] 对象就像上面的工厂一样。因为这是没有反射的普通 Java,所以它在 Android 和嵌入式系统上可以更快,并且可以使用现有工具进行优化。

还要注意,Dagger 是由 Bob Lee 在 Square 编写的(他最初在 Google 编写了 Guice); Dagger 2 项目是对 Google 维护的 Dagger 的重写,它改变了一些关于如何配置 Dagger 以及如何避免使用反射的细节。 Dagger 和 Dagger 2 都是 Java 的基于注解的编译时依赖注入框架,但它们彼此略有不同。

究竟什么是依赖注入?

你会发现很多关于依赖注入的技术内容,但新学习者发现大部分时间都停留在弄清楚对 DI 的基本理解上。这是 DI 的 real-life 示例。

DI 的重要性

  • 提高代码的可重用性
  • 松耦合依赖的良好平衡
  • 易于重构
  • 易于测试和调试

什么是匕首?

Dagger 是一个 DI 框架,在 Android 开发中会为您生成大量样板代码以实现依赖注入的目标。

什么时候用匕首?

我在 Android Dev Summit '19 课程中用匕首也对 DI 有了清晰的认识,希望这也能使你的认识更加清晰。