什么是匕首,以及它是如何运作的

时间:2016-09-09 05:05:41

标签: android dagger

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

由于

2 个答案:

答案 0 :(得分:26)

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

什么是依赖注入?

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

例如,我们假设您的课程A取决于课程B,这取决于课程CD。 (实际上,这可能是一个依赖于BusinessLogicClass的应用程序,它取决于计算器和数据库。)它可能如下所示:

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

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

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

什么是依赖注入框架?

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

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

依赖注入框架通常附带一种语言供您指定映射,通常称为绑定,这只是指示在类要求时应创建EImpl的方法。当班级要求EInterface时,FSubclassFClass。这种语言还允许您选择何时创建新实例:在每个请求上,跨越整个应用程序("单例")或其他。 Spring使用XML,Guice使用自定义Java类语言; Dagger使用Java接口,类和注释。

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

JSR 330怎么样?

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

为什么Dagger是编译时很重要的?

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

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

答案 1 :(得分:3)

什么是依赖注入?

您会发现很多有关依赖注入的技术内容,但是新学习者会花大量的时间来了解DI的基本知识。这是DI的real-life示例。

DI的重要性

  • 提高代码的可重用性
  • 宽松的依赖关系之间的良好平衡
  • 易于重构
  • 易于测试和调试

什么是匕首?

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

何时使用匕首?

enter image description here

我希望从Android Dev Summit '19的那一刻起,我都能用匕首清楚地看到DI,这也将清除您的视野。