我知道这可能不是问问题的正确方式,但在读了很多遍之后,我仍然对匕首以及它是如何工作的以及我们为什么要使用它感到困惑。因为它已经在我目前的工作项目中使用。请有人用简单的话给我一点提示,匕首的目的是什么会很有帮助。
谢谢

最佳答案

匕首是基于Java注释的编译时JSR-330依赖注入框架。
什么是依赖注入?
Dependency injection(有时称为控制反转或IOC)基于这样一个理念:给定的类不需要知道如何创建或提供它所依赖的类。提供这些依赖项应该是类的用户(或单独的类或工厂)的责任。
例如,假设您有依赖于classA的classB类,依赖于classCD类。(实际上,这可能是一个应用程序,依赖于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的方法。这种语言还允许您选择何时创建新实例:在每个请求中,在整个应用程序(“singleton”)中创建一次,或者以其他方式创建。Spring使用XML和Guice使用自定义Java类语言;Dagger使用Java接口、类和注释。
您可以在没有容器或框架的情况下进行依赖项注入,但大多数情况下,当您提到依赖项注入时,人们会想到类似Spring、Guice或Dagger的框架。这些框架自动化了您在上面看到的许多FClass样板文件,否则将使“手动”依赖项注入很难工作。
JSR 330怎么样?
Java将一些接口和注释标准化为"JSR 330",以便更容易在依赖注入框架之间进行切换,并且可以轻松地编写在任何框架中工作的库。像弹簧和吉他一样,匕首也符合这个标准。
为什么匕首是编译时间这件事很重要?
其他依赖注入框架(包括Spring和Guice)在运行时进行它们的配置:它们使用Java反射来检查类的构造函数、方法和字段。这在服务器和台式机上的生产速度可能会很慢,而且由于虚拟机的差异和移动处理器/内存的限制,Android上的生产速度也非常慢。因此,Square和谷歌的团队编写了Dagger和匕首2,使用Java annotation processing在编译时检查类,并自动编写普通Java对象的标准Java代码,像上面的工厂一样运行。因为这是没有反射的纯Java,它可以在Android和嵌入式系统上快得多,并且可以使用现有工具进行优化。
请注意,匕首也是由Bob Lee(最初在Google上写Guice)在Square上编写的;匕首2项目是对Google维护的匕首的重写,它改变了有关如何配置匕首以及如何避免使用反射的一些细节。Dagger和匕首2都是基于Java的编译时依赖依赖注入框架,但它们彼此略有不同。

07-24 09:49
查看更多