为什么要使用/开发Guice,当你有Spring和Dagger时?[已关闭]

2022-08-31 12:41:18

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

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

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

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


答案 1

重要的是要承认,Dagger是在Guice之后由Guice的创作者之一(“Crazy Bob”Lee)创建的,他已经搬到了Square:

  • Rod Johnson最初于2002年10月发行了Spring,他的书《Expert One-on-One J2EE Design and Development》;Spring随后于2003年6月在Apache许可证上公开发布,并于2004年3月作为v1.0发布。
  • Google最初于2007年3月公开发布了Guice
  • JSR-330于2009年10月正式化了注释,由Google(Bob Lee)和SpringSource(Rod Johnson)提交,其专家组中的其他行业合作者。javax.inject
  • Square最初于2013年5月公开发布了Dagger 1。
  • 谷歌最初于2015年4月公开发布了Dagger 2。
  • Square 在 2016 年 9 月 15 日提出此问题前 10 天将 Dagger 1 标记为已弃用。

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

要列出并修改上述差异,请执行以下操作:

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

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


答案 2

推荐