Google Guice与JSR-299 CDI / Weld

Weld,JSR-299上下文和dependency injection参考实现,认为自己是Spring和Guice的inheritance者。

CDI受到许多现有Java框架的影响,包括Seam,Guice和Spring。 然而,CDI具有自己独特的特征:比Seam更安全,比Spring更具有状态和更less的以XML为中心,比Guice更具networking和企业应用能力。 但是,如果没有上述框架的启发和JSR-299专家组(EG)的大量合作和辛勤工作,这些都不会有任何启发。

http://docs.jboss.org/weld/reference/latest/en-US/html/1.html

与Guice相比,什么让Weld更适合企业应用? 与Guice相比,有没有什么优缺点? 与Weld拦截器相比,您如何看待Guice AOP? 性能呢?

我的select

最后,我决定使用Guice,因为我喜欢干净的编程模型,默认情况下,除了@Inject之外几乎没有注释。 使用Guice的外部库比使用CDI容易得多。 Guice的AOP也很简单。

在试图回答你的问题之前,让我加上一个重要的信息: JSR 330 ( @Inject )由Guice和Spring项目( 2009年5月发布 )标准化,并在JSR 299中被重用 。 这包括声明注入点的基本DI机制。

现在回到这个问题 – 我有一个免责声明,那就是我对Spring的经验远远超过了Guice。

Weld中的企业function

  • 备用configuration机制在JSR-299中具有非常干净的devise,并允许在Java代码之外的configuration机制( beans.xml )。
  • 事件是一个非常强大的事情,并与JMS很好地配合。 我刚刚find了一个Guice的Event Bus ,但我不能说比较。
  • 可移植扩展是一种SPI,可用于与现有技术集成,或以干净的方式封装遗留代码。

优点缺点

注意:稍后我会尝试添加一些项目,但是这个答案已经比我预期的要长,对不起。

  • 焊接/ CDI

    • 标准化 :如果标准化和实施得当,很多人都会使用它。 示例:Weld中的内置范围提供了比Guice或Spring更多的范围。 所有这些都可以扩展,但是如果大型社区正在使用应用程序框架,那么它们应该依赖于标准范围。
    • 容器支持 :这与前面的项目类似,但是是一个被采纳的主要论点。 主要的开源应用服务器,如Glassfish和JBoss 6提供了CDI支持(见这里 )。
  • 吉斯/春

    • 实际应用 :现有的大部分应用程序已经在使用Guice / Spring了。 Spring / Guice总是以标准为基础,在没有标准或不能使用标准的情况下提供新的function。 如果您遵循各自的最佳实践,框架将帮助您使您的应用程序标准化和清洁。

AOP和拦截器

这是一个非常深入讨论的话题,我不能相互赞成。 这两种机制都非常强大,但至less需要对应用程序体系结构的最低限度的理解。 也看看装饰者和以前引用的事件 。 最好是配合正确的工具,但是不要忘记,如果开发人员必须使用其中一种机制,那么如果他/她理解这个概念,这是一件好事。

性能

不幸的是,我还没有看到这一点,但有一些规则,我试图遵循,尤其是当使用一个框架,给你很多的function,而你没有注意到:

  • 只要有可能,在运行时更喜欢多个查找的单个接线步骤。
  • 如有可能,请执行应用程序初始化的所有接线。
  • 任何拦截步骤或AOP代理都会向堆栈添加一些方法调用。

CDI(Weld)还没有被广泛使用,所以比较难以做到。 几点:

  • CDI已经被devise为与EJB3,JSF和其他JavaEE标准集成在一起。 CDI具有所谓的便携式扩展,允许第三方库与CDI实现的生命周期和内部function集成
  • CDI的devise考虑了所有可能的angular落案例,所以它可能涵盖了您所需要的一切。 Spring,Guice和Seam发展到这样一个状态,而CDI使用这三者的经验。
  • 在我看来,CDI拦截器将无法满足Spring AOP遇到的所有需求。 也许Guice AOP也是一样的。 你不能使用AspectJ语法定义一个拦截器。
  • 缺lessxml定义既是优点也是劣势,有些人(在某些情况下)更喜欢xmlconfiguration。
  • 如果不仔细使用,则限定符注释的扩展使用(在我看来)会产生一些大的混乱。

CDI最重要的特点是反对Guice,它是Java EE 6的标准部分。

这一点的重要性不容低估,因为这意味着CDI是编码Web应用程序时应使用的DI标准。

前一阵子,我看了一下技术,能够确定我们如何拥有一个标准的核心发行版(适当地准备好),在那里我们可以随意添加额外的模块,而无需改变核心模块就可以覆盖现有的function。 即添加一个额外的jar,并自动激活function。

事实certificate,对于我们在桌面和Web应用程序中使用的代码库,最好的办法是使用JSR-330注释代码,然后使用CDI或者Guice(SVN) 3.0)作为引擎。

经过几个项目后,我发现我最喜欢Guiceconfiguration,而不是Weld中的不透明魔法。 此外,我发现如上所述的方式来执行我们想要的与Weld,我必须在额外的jar中标记类@Alternative,然后在beans.xml中提到,我希望替代类强制执行(而不是强大的重构)。

但是,总而言之,JSR-330让我们能够做一些以前非常乏味和脆弱的事情(因为new非常紧密),这是一个伟大的胜利。 如果您有任何需要,我强烈build议您查看DI。

用于Guice用户的CDI是一个很好的比较。

另一个区别是CDI是非常面向Java EE的。 它提供了将不同Java EE子系统粘合在一起的机制。

IE浏览器。 通过使用@Named("book")注释一个bean,这个bean在统一的EL(expression式语言)中变成“ book ”。

那么你可以在JSF页面中使用它:

  <h:outputLabel value="Book title:" for="bookTitle"/> <h:outputText id="bookTile" value="#{book.title}"/>