为什么 use/develop Guice,当你有 Spring 和 Dagger?

Why use/develop Guice, when You have Spring and Dagger?

据我所知,Dagger 确实生成代码,而 Guice 和 Spring 依赖于运行时处理,因此 Dagger 运行速度更快,但需要更多的程序员工作。由于性能优势,它有利于移动 (Android) 开发。

然而,当我们只剩下 Guice 和 Spring 时,后者有很多集成。 developing/using Guice 有什么意义,如果我们可以使用 Spring 框架(基本上做同样的事情,但提供更简单的数据库访问)?

Google 不是在尝试通过创建自己的 DI 工具来重新发明轮子,而不是使用(并可能参与)Spring 框架吗?

我正在寻找决策树,它可以指导选择 DI 工具。

重要的是要认识到 Dagger 是在 Guice 之后创建的,由 Guice 的一位创建者 ("Crazy Bob" Lee) 转移到 Square:

  • Spring 最初发布于 October 2002
  • Google 最初在 March 2007 中公开发布了 Guice。
  • JSR-330 formalized javax.inject annotations in October 2009,Google (Bob Lee)、Spring 和其他行业参与者的大量投入。
  • Square 最初在 May 2013 公开发布了 Dagger 1。
  • Google 最初在 April 2015 中公开发布了 Dagger 2。
  • Square 在 September 15, 2016.
  • 提出此问题前 10 天将 Dagger 1 标记为已弃用

从这个意义上说,Guice 的持续管理与其说是 "reinventing the wheel" 不如说是对长期 运行 和广泛使用的软件包的维护,该软件包完全早于任何版本的 Dagger。您可能认为 Dagger 是 Guice 的精神继承者,但它只提供 Guice 功能的优化子集

列出并修改您在上面的差异:

  • Spring 是一个相对重量级的框架,具有大量集成、XML 配置语言和 runtime/reflective 绑定。已经使用 Spring 的应用程序可以使用 Spring 的依赖注入框架,只需很少的额外工作。
  • Guice 是一个相对轻量级的框架,具有较少的集成、Java 实例配置和 runtime/reflective 绑定。通过使用 Java 绑定,您可以获得编译时类型检查和 IDE 自动完成集成。
  • Dagger 是一个非常轻量级的框架,具有很少的集成、Java interface/annotation 配置和编译时代码生成的绑定。代码生成方面使 Dagger 整体性能非常好,尤其是在资源有限和移动环境中。 (Android 的 VM 与服务器 JRE 的不同之处在于反射特别慢,因此 Dagger 在这里特别有用。)
  • 上述所有三个框架都支持 JSR-330,因此精心设计的库或应用程序几乎与所用的 DI 容器无关。

除此之外,请留意您使用的任何框架中的 maintenance/deprecation 模式和策略。根据您团队的知识和经验、您对反射或运行时配置的需求,以及您对集成和运行时性能的需求,您可能会看到上述其中一项脱颖而出。也就是说,还有其他框架,因此请密切关注上述框架的新选项和分支。