我应该在业务层中使用EJB3还是Spring?


73

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

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

这是我的问题:

  1. 支持或反对EJB3 vs Spring的论据是什么?
    • 我希望每个陷阱有什么陷阱?
    • 在哪里可以找到良好的基准信息?

3
恕我直言,Spring在任何环境下都将非常有用,并有助于您的开发工作。我认为我将在每种情况下都使用Spring,并且只考虑在特殊情况下使用EJB3(例如,我有一些我需要的应用程序服务器功能(例如管理选项))。
Shimi Bandiel

Answers:


74

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

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

4
我会更依赖Java EE实现之间的兼容性,而不是在服务器之间携带一些专有容器。
ymajoros 2012年

1
“ Java EE实现之间的兼容性”在纸面上很不错,但是将EJB应用程序部署在不同的应用程序服务器上则是另一回事,与仅移动Spring容器(本身不是专有的)不同
Mehdi LAMRANI 2016年

37

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

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

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

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


5
++,这样可以更轻松地找到遇到您要解决的相同问题的人
Martin K.

3
在撰写本文时,这可能是有效的。在2012年,事实并非如此。
ymajoros 2012年

18

支持或反对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企业版。我认为完全符合所有规格的巨型服务器的时代已经过去。


真好 不幸的是,基准测试没有考虑到春季。但这是整体上很好的信息。
贾斯汀标准时间

9

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

  1. 从EJB3开始,您不再需要处理外部配置文件,并且每个数据库表仅注释一个POJO。此POJO可以毫无问题地传递到您的Web层。像Netbeans这样的IDE甚至可以为您自动生成这些POJO。现在,我们已经将EJB3用作许多大型应用程序的后端,并且尚未注意到任何性能问题。您的Session Bean可以很容易地公开为Web服务,您可以将其公开给Flex前端。会话bean很容易在方法或类级别锁定,以根据需要分配角色和类似的东西。

关于春天,我只能说几周,所以我不能说太多。但是我对此的总体印象很差。这并不意味着它是一个糟糕的框架,但是我们的团队在这里发现EJB3是持久性/业务层的最佳选择。


@rustyshelf:您能否评论数据库的大小和同时登录的用户数,或每秒的事务数?
贾斯汀标准时间

我们的应用程序之一拥有2500个注册用户,其中一次最多只能登录100个。其他用户的并发用户较少,但自从上线以来,受到的点击率一直很高。我们将Glassfish用作我们的容器,而Apache放在前面,但有时仅是GF。
rustyshelf

在数据库大小方面,您是指表还是表中的行?我假设您的意思是数据,如果是这样,那么我们的表就很小。我要说的是,我们的任何表中的行数都不会超过20,000。
rustyshelf

1
我的意思是行,所以这很小。感谢您的观点。
贾斯汀标准时间

7

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

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

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

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


2

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


1
Flex Data Services是BlazeDS的专有版本吗?
贾斯汀标准时间


0

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

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


也许在撰写本文时(不能证明这一点,至少要如此)。当然不在2012
。– ymajoros

-3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.