【问题标题】:Why use/develop Guice, when You have Spring and Dagger? [closed]当您拥有 Spring 和 Dagger 时,为什么要使用/开发 Guice? [关闭]
【发布时间】:2017-02-02 23:17:21
【问题描述】:

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

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

Google 不是在尝试通过创建自己的 DI 工具来重新发明轮子,而不是使用(并可能为 Spring Framework 做出贡献)吗?

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

【问题讨论】:

  • SO 不是推荐/比较软件产品。我认为你的问题在这里真的是题外话。
  • Spring 是一个巨大的、巨大的、庞大的库和实用程序集合。 DI 框架只是其中的一小部分。 Guice 是轻量级的,只是一个 DI 框架。此外,GWT(例如)不能使用 Spring,因为它被编译为 JavaScript。人们可能会问为什么 Spring 存在,因为它正在重塑 CDI
  • @GhostCat 好的,那我应该去哪里问呢?
  • @BoristheSpider 我正在使用带有 vaadin 的 spring(使用 gwt),它工作正常。就 DI 而言,与 guice 相比,spring 是什么重量级的?
  • 我假设您在 服务器端使用 Spring。不在客户端代码中。至于你的第二个问题;我把它作为练习留给你做一些研究。

标签: java spring guice dagger-2


【解决方案1】:

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

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

从这个意义上说,Guice 的持续管理并不是“重新发明轮子”,而是维护一个长期运行且广泛使用的软件包,该软件包彻底早于任何版本的 Dagger。您可能会认为 Dagger 是 Guice 的精神继承者,但它只提供 Guice 功能的优化子集

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

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

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

【讨论】:

  • 非常感谢您的回答,它让我对许多事情大开眼界。事实上,在这种情况下,将 Guice 称为重新发明是一个重大错误。如果所有这 3 个框架都实现相同的标准,是否有可能 ex.使用 Dagger 轻量级 DI 而不是 Spring 的,但同时保留 Spring 的集成(如 Spring Data)?
  • @spam 很高兴您喜欢这个答案!我没有研究过 Spring Data,但我认为您不一定可以假设您可以在另一个框架上使用集成。尽管它们等效地处理 JSR-330 定义的 DI,但某些框架具有其他地方不可用的内部数据结构或反射/自省。您可能需要权衡 Spring 与 Dagger 在它们提供的集成中的使用。
  • 这是一个很好的答案 - 您已经将一个可能基于意见的问题变成了对 3rd 方 DI 框架中主要参与者的有价值的总结。 +1!
  • 正如我在 Guice 的 github 中看到的,他们正在使用反射——它是如何轻量级的? Spring 不是在做同样的事情吗(现在只谈 DI)?
  • 但是 Spring Framework(没有 Spring 子项目)与 Guice 之类的 DI 差不多。你能推荐几个用例,Guice 是不错的选择,而 Spring 框架不是吗?
猜你喜欢
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多