为什么要使用/开发Guice,而不是使用Spring和Dagger?

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

然而,当我们只有Guice和Spring可用时,后者具有许多集成选项。如果我们可以使用Spring Framework(基本上做同样的事情,但提供了例如更容易的数据库访问),那么开发/使用Guice的意义何在呢?
谷歌是不是试图重新发明轮子,创建自己的DI工具,而不是使用(可能还为)Spring框架做贡献呢?
我正在寻找一棵决策树,指导选择DI工具。

2
SO不是关于推荐/比较软件产品的。我认为你的问题在这里真的很离题。 - GhostCat
1
Spring是一个庞大的库和工具集合。DI框架只是其中的一小部分。Guice是轻量级的,只是一个DI框架。此外,GWT(例如)无法使用Spring,因为它被编译为JavaScript。有人可能会问为什么Spring存在,因为它正在重新发明CDI。 - Boris the Spider
3
@GhostCat 好的,那我应该在哪里询问呢? - spam
@BoristheSpider 我正在使用Spring与Vaadin(它使用GWT),一切都很好。在依赖注入方面,Spring相对于Guice的重量级是什么原因? - spam
我投票关闭此问题,因为它不在范围内。 - Olivier Grégoire
显示剩余3条评论
1个回答

240

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

  • Rod Johnson 最初在他的书Expert One-on-One J2EE Design and Development中于2002年10月发布了Spring;然后在2003年6月以Apache许可证的形式公开发布,并于2004年3月发布v1.0。
  • Google 最初在2007年3月公开发布了Guice
  • JSR-3302009年10月正式规范了javax.inject注释,由Google(Bob Lee)和SpringSource(Rod Johnson)提交,并由其专家组的其他行业合作伙伴参与。
  • Square 最初在2013年5月公开发布了Dagger 1
  • Google 最初在2015年4月公开发布了Dagger 2
  • 在此问题提出10天前,即2016年9月15日,Square将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容器保持不可知。

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


3
很高兴你喜欢这个答案!我没有研究过Spring Data,但我认为你不能假设你可以在一个框架中使用另一个框架的集成。尽管它们都等效地处理JSR-330定义的DI,但一些框架具有其他地方不可用的内部数据结构或反射/内省。你可能需要权衡使用Spring还是Dagger提供的整合。 - Jeff Bowman
53
这是一个很好的答案——你把一个可能会以个人意见为基础的问题转化成了关于第三方 DI 框架主要参与者的有价值的概述。加一分! - Boris the Spider
1
我在Guice的Github上看到他们正在使用反射 - 这怎么可能是轻量级的呢?Spring不也在做同样的事情吗(现在只谈论DI)? - spam
1
但是Spring框架(不包括Spring子项目)除了像Guice一样的DI之外,几乎没有做更多的事情。您能否提供一些使用案例,在这些案例中Guice是一个好选择而Spring框架则不是? - spam
请问您能否解释一下为什么Spring框架是轻量级的? - explorer
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接