我知道这可能不是提问的正确方法,但在阅读了很多很多内容后,我仍然对匕首及其运作方式以及为什么要使用匕首感到困惑。自从它在我目前的工作项目中使用。请有人用简单的话语给我一些暗示,匕首的目的是什么,将会非常有帮助。
由于
答案 0 :(得分:26)
Dagger是基于 Java注释的编译时JSR-330依赖注入框架。
Dependency injection(有时称为控制反转或IoC)基于这样的想法,即给定的类不需要知道如何创建或提供它所依赖的类。提供这些依赖关系应该是班级用户(或单独的班级或工厂)的责任。
例如,我们假设您的课程A
取决于课程B
,这取决于课程C
和D
。 (实际上,这可能是一个依赖于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
时,FSubclass
或FClass
。这种语言还允许您选择何时创建新实例:在每个请求上,跨越整个应用程序("单例")或其他。 Spring使用XML,Guice使用自定义Java类语言; Dagger使用Java接口,类和注释。
你可以在没有容器或框架的情况下进行依赖注入,但是当你提到依赖注入时,大多数时候人们都会想到像Spring,Guice或Dagger这样的框架。这些框架会自动消除您在上面看到的许多new
样板,否则可能会导致"手动"依赖注入难以使用。
Java将一些接口和注释标准化为"JSR 330",以便更容易在依赖注入框架之间切换,并使编写在任何框架中工作的库变得容易。像Spring和Guice一样,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开发中依赖项注入的目标。
何时使用匕首?
我希望从Android Dev Summit '19的那一刻起,我都能用匕首清楚地看到DI,这也将清除您的视野。