关于java:我应该在业务层中使用EJB3还是Spring?

关于java:我应该在业务层中使用EJB3还是Spring?

Should I use EJB3 or Spring for my business layer?

我的团队正在开发具有Web前端的面向服务的新产品。 在讨论我们将使用哪些技术时,我们决定运行JBoss应用程序服务器,Flex前端(可能使用Adobe AIR进行桌面部署)和Web服务以连接客户端和服务器。

在将哪种服务器技术用于我们的业务逻辑方面,我们陷入了僵局。 最大的争论是在EJB3和Spring之间,我们最大的担忧是可伸缩性和性能以及代码库的可维护性。

这是我的问题:

  • 支持或反对EJB3 vs Spring的论据是什么?

    • 我希望每个陷阱有什么陷阱?
    • 在哪里可以找到良好的基准信息?

  • 基于Performance,EJB3和Spring之间不会有太大区别。我们选择Spring的原因如下(问题中未提及):

    • Spring朝着更容易支持单元测试的方向驱动架构。例如,注入模拟DAO对象以对业务层进行单元测试,或者利用Spring的MockHttpRequest对象对Servlet进行单元测试。我们为单元测试维护一个单独的Spring配置,使我们可以将测试隔离到特定的层。
    • 首要的驱动因素是兼容性。如果您需要支持多个App Server(或者最终希望从JBoss迁移到Glassfish等),则实际上将随身携带容器(Spring),而不是依赖于不同实现的兼容性。 EJB3规范。
    • Spring允许为持久性,对象远程处理等选择技术。例如,我们还使用Flex前端,并且使用Hessian协议在Flex和Spring之间进行通信。

    显然,EJB3和Spring之间的差距比以前小得多。也就是说,EJB3的缺点之一是您只能注入到bean中,因此最终可以将组件转换成不需要的bean。

    现在关于单元测试的争论已经不那么重要了-EJB3显然被设计为更容易进行单元测试。

    上面的兼容性参数也无关紧要:无论您使用EJB3还是Spring,您仍然依赖于第三方提供的事务管理器,JMS等实现。

    但是,对我来说,摇摆不定是社区的支持。去年从事EJB3项目的人们很少使用它并谈论他们的问题。无论是对是错,Spring在企业中无处不在,尤其如此,这使得查找与您要解决的问题相同的人变得更加容易。


    支持或反对EJB3 vs Spring的论据是什么?
    Spring一直在创新,并认识到现实世界中的限制。 Spring为Java 1.4应用程序服务器提供了简单和优雅,并且不需要2004年至2006年没有人可以使用的J2EE规范版本。在这一点上,您几乎可以陷入一个宗教争论中-Spring +抽象+开源与Java Enterprise Edition(Java EE)5.0规范。

    我认为Spring与Java EE规范相比具有补充优势。随着曾经是Spring独有的功能继续融入该规范,许多人会争辩说EJB 3为大多数内部业务应用程序提供了"足够好"的功能集。

    我希望每个陷阱有什么陷阱?
    如果您将其视为持久性问题(Spring + JPA)与EJB3的比较,那么您真的没有那么大的选择。

    在哪里可以找到良好的基准信息?
    我有一段时间没有关注specj的基准测试结果,但是一段时间以来它们仍然很受欢迎。似乎每个供应商(IBM,JBOSS,Oracle和Sun)对拥有兼容服务器的兴趣越来越少。从1.3、1.4开始,认证供应商的名单越来越少。 1.5 Java企业版。我认为完全符合所有规格的巨型服务器的时代已经过去。


    我肯定会在春季推荐EJB3。我们发现它更加精简,更易于编码,并且得到了更好的支持。我过去使用过Spring,发现它非常令人困惑,并且没有EJB3(或我想在今天结束时的JPA)那样好的文档

  • 从EJB3开始,您不再需要处理外部配置文件,并且每个数据库表仅注释一个POJO。此POJO可以毫无问题地传递到您的Web层。像Netbeans这样的IDE甚至可以为您自动生成这些POJO。现在,我们已经将EJB3用作许多大型应用程序的后端,并且尚未注意到任何性能问题。
    您的Session Bean可以很容易地作为Web服务公开,可以向Flex前端公开。
    会话bean很容易在方法或类级别锁定,以根据需要分配角色和类似的东西。
  • 关于春天,我只能说几周,所以我不能说太多。但是我对此的总体印象非常差。这并不意味着它是一个糟糕的框架,但是我们的团队在这里发现EJB3是持久性/业务层的最佳选择。


    我倾向于使用Spring而不是EJB3,但是我的建议是无论采取哪种方法,都尽量坚持编写POJO并在可能的地方使用标准注释,例如@ PostConstruct,@ PreDestroy和@Resource之类的JSR注释,它们都可与EJB3一起使用或Spring,因此您可以选择自己喜欢的框架。

    例如您可以决定某个项目使用Guice代替IoC。

    如果要在Web应用程序中使用请求前注入,则可能会发现Guice依赖注入比Spring快很多。

    会话bean主要归结为依赖注入和事务。因此,EJB3和Spring确实有点相似。 Spring的优势在于更好的依赖注入和对JMS之类的更好的抽象


    我过去使用过非常相似的架构。 Spring + Java 1.5 + Actionscript 2/3与Flex Data Services相结合,使编写代码变得非常容易(而且很有趣!)。
    但是,Flex前端意味着您需要足够强大的客户端计算机。


    关于您的问题:

    What are the arguments for or against EJB3 vs Spring?

    我建议阅读专家的回复:Mark Fisher的回应:EJB 3和SPRING比较分析。阅读注释以查找Reza Rahman的评论(EJB 3.0)。


    支持spring的另一件事是,那里的大多数其他工具/框架都更好地支持了与spring的集成,其中大多数也都在内部使用spring(例如activemq,camel,CXF等)。

    它比EJB3更成熟,并且有更多的资源(书籍,文章,最佳实践等)和经验丰富的开发人员。


    我认为EJB是一个很好的组件技术,但不是一个很好的框架.Spring是迄今为止可用的最佳框架。因此从框架的意义上讲,我应该将Spring视为JEE的最佳实现,我的建议是在每个框架中都使用spring该项目使我们可以灵活轻松地与任何组件技术集成。


    推荐阅读