Google Guice与PicoContainer进行dependency injection

我的团队正在研究dependency injection框架,并试图在使用Google-Guice和PicoContainer之间做出决定。

我们正在寻找我们的框架中的几件事情:

  1. 一个小的代码足迹 – 我的意思是一个小的代码足迹是我们不希望在我们的代码库中随处存在dependency injection代码。 如果我们需要重构道路,我们希望它尽可能简单。
  2. 性能 – 创build和注入对象时每个框架有多less开销?
  3. 易用性 – 是否有很大的学习曲线? 我们必须编写一些代码来获得简单的工作吗? 我们希望有尽可能less的configuration。
  4. 社区规模 – 较大的社区通常意味着项目将继续保持。 我们不想使用一个框架,并且必须修复我们自己的错误;)我们的任何问题都可以(希望)由框架的开发者/用户社区来回答。

这两个框架与所列标准的比较将不胜感激。 任何有助于比较两者的个人经验也是非常有帮助的。

免责声明:如果我提出一个与本次讨论无关的问题,我相当注意dependency injection,所以请原谅我的小心。

您可能希望在您正在考虑的dependency injection框架列表中包含Spring。 以下是您的问题的一些答案:

耦合到框架

Pico – Pico倾向于阻止二传注射,但除此之外,您的课程不需要知道Pico。 这只是需要知道的布线(所有DI框架都是如此)。

Guice – Guice现在支持标准的JSR 330注释,所以你不再需要代码中的Guice特定的注释。 Spring也支持这些标准的注释。 Guice人使用的论点是没有运行Guice注释处理器,如果你决定使用不同的框架,这些应该不会有影响。

Spring – Spring旨在让您避免在代码中提到Spring框架。 因为他们有很多其他的助手/实用程序等等,但是依赖于Spring代码的诱惑依然强烈。

性能

Pico – 我不太熟悉Pico的速度特性

Guice – Guice被devise得很快,参考文献中提到的比较有一些数字。 当然,如果速度是主要的考虑因素,则应考虑使用Guice或手动布线

spring – spring可以缓慢。 已经有一些工作要加快速度,使用JavaConfig库会加快速度。

使用方便

Pico – 简单configuration。 Pico可以为你做一些autowire决定。 不清楚它如何扩展到非常大的项目。

Guice – 简单的configuration,你只需添加注释并从AbstractModuleinheritance来将事物绑定在一起。 将configuration保持在最低限度,可以很好地扩展到大型项目。

Spring – 相对容易configuration,但大多数例子使用Spring XML作为configuration的方法。 随着时间的推移,Spring XML文件可能变得非常庞大和复杂,需要花费时间来加载。 考虑使用Spring和手动混合的dependency injection来克服这个问题。

社区大小

微微 – 小

吉斯 – 中等

spring – 大

经验

Pico – 我还没有很多Pico的经验,但它不是一个广泛使用的框架,所以它会更难find资源。

Guice – Guice是一个非常受欢迎的框架,当你有一个大型项目正在重新开发时,它对速度的关注是值得欢迎的。 我担心configuration的分布性,也就是说我们整个应用程序的整合是不容易的。 在这方面有点像AOP。

spring – spring通常是我的默认select。 也就是说,XML可能会变得繁琐,导致减速烦人。 我经常最终使用手工制作的dependency injection和Spring的组合。 当你真正需要基于XML的configuration时,Spring XML是相当不错的。 Spring还花费了大量的精力来使其他框架更dependency injection友好,因为他们经常使用最佳实践(JMS,ORM,OXM,MVC等)。

参考

  • 微微
  • 吉斯
  • 弹簧
  • Spring / Guice / Pico比较
  • 另一个春季/ Guiceperformance比较

jamie.mccrindle提供的答案其实是相当不错的,但是我很困惑,为什么Spring是默认的select,当我们清楚地知道,Pico和Guice都可以使用更好的select。 国际海事组织(IMO)春季的受欢迎程度已经达到了顶峰,现在它正在生成炒作(连同其他“我也是”春季子项目,希望能够顺应spring的潮stream)。

Spring的唯一真正的优势是社区规模(坦率地说,由于其规模和复杂性,这是必要的),但Pico和Guice 不需要庞大的社区,因为他们的解决scheme更清洁,更有组织,更优雅。 Pico似乎比Guice更加灵活(您可以在Pico中使用注释,或者不使用注释 – 效率极高)。 (编辑:意思是说它是非常灵活的,而不是它也不是有效的。)

Pico的小尺寸和缺乏依赖是一个不容忽视的重大胜利。 现在需要下载几个megs来使用Spring? 这是一个巨大的jar文件,所有它的依赖。 直觉地认为,这样一个有效率的“小”解决scheme应该比Spring更好地扩展和执行。 spring的膨胀真的会让它变得更好吗? 这是不是奇怪的世界? 我不会假设Spring是“更可扩展的”,直到被certificate(并解释)为止。

有时创造一些好的东西(微微/吉斯),然后保持你的手而不是增加无尽的新版本的膨胀和厨房水槽function真的没有办法…

注意:这是更多的评论/咆哮比答案

PicoContainer是伟大的。 如果他们只是修复他们的网站,我会切​​换回去。 现在真的很混乱

我现在正在使用Guice 2.x,即使它更大,function也更less。 find文档比较容易,而且用户组非常活跃。 然而,如果“Guice 3”的方向是任何迹象的话,Guice似乎就开始臃肿起来,就像spring早期的那样。

更新:我发布了对Pico Container的评论,他们对网站做了一些改进。 现在好多了!

这是一个老问题,但今天你可以在你的Android应用程序项目中考虑Dagger( https://github.com/square/dagger )。 Dagger在编译时生成代码。 所以在执行时间上,启动时间更短,内存使用量更less。

如果你是在一个简单的DI容器后,你可以检查出羽毛 。 只有Vanilla JSR-330 DIfunction,但在占用空间(16K,无相关性)和性能方面相当不错。 在Android上工作。

虽然我很喜欢PicoContainer,但它的简单性和缺乏依赖性。 我build议使用CDI,因为它是Java EE标准的一部分,所以你没有供应商locking。

在侵入性方面,主要的问题是容器的需求以及使用相对空的META-INF / beans.xml文件(需要指出该jar使用CDI)以及使用注释(虽然它们是标准的)

我用于自己的项目的轻量级CDI容器是Apache Open Web Beans。 虽然花了一段时间才弄清楚如何创build一个简单的应用程序(不像Pico),看起来像这样。

public static void main(final String[] args) { final ContainerLifecycle lifecycle = WebBeansContext.currentInstance() .getService(ContainerLifecycle.class); lifecycle.startApplication(null); final BeanManager beanManager = lifecycle.getBeanManager(); // replace Tester with your start up class final Bean<?> bean = beanManager.getBeans(Tester.class).iterator() .next(); final Tester b = (Tester) lifecycle.getBeanManager().getReference(bean, Tester.class, beanManager.createCreationalContext(bean)); b.doInit(); }