当你拥有Spring和Dagger时,为什么要使用/开发Guice?

spa*_*pam 45 java spring guice dagger-2

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

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

谷歌是不是试图通过创建自己的DI工具来重新发明轮子,而不是使用(并可能有助于)Spring Framework?

我正在寻找决策树,通过选择DI工具来指导.

Jef*_*ica 123

重要的是要意识到Dagger是在Guice之后创建的,由Guice的创作者之一("Crazy Bob"Lee)移居广场:

  • Spring最初于200210月发布.
  • Google最初于20073月公开发布了Guice .
  • JSR-330javax.inject200910月正式化注释,得到了Google(Bob Lee),Spring和其他业内人士的大量投入.
  • Square最初于20135月公开发布了Dagger 1 .
  • Google最初于20154月公开发布了Dagger 2 .
  • 20169月15日,在提出此问题之前10天,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容器无关.

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

  • 这是一个很好的答案 - 你可以将一个基于意见的问题转化为第三方DI框架中主要参与者的有价值的总结.+1! (11认同)
  • @spam很高兴你喜欢这个答案!我没有看过Spring Data,但我认为你不一定可以假设你可以使用另一个框架中的集成.尽管它们等同于处理JSR-330定义的DI,但某些框架具有内部数据结构或反射/内省,这在其他地方是不可用的.您可能需要在它们提供的集成中权衡Spring与Dagger的使用. (3认同)