Spring vs EJB。Spring可以代替EJB吗?[关闭]


96

由于Spring能够像EJB一样使用事务。对我来说,Spring能够代替使用EJB的需求。谁能告诉我使用EJB的其他优点是什么?

Answers:


201

Spring从一开始就被开发为EJB的替代品,因此答案当然是您可以使用Spring代替EJB。

如果说使用EJB有“优势”,我想这将取决于您团队的技能。如果您没有Spring专业知识,并且拥有丰富的EJB经验,那么坚持使用EJB 3.0是一个不错的选择。

从理论上讲,为支持EJB标准而编写的应用服务器可以从一台兼容的Java EE应用服务器移植到另一台。但这意味着远离任何将您锁定在一个供应商中的供应商特定扩展。

Spring不依赖于它们,因此可以轻松地在应用程序服务器(例如WebLogic,Tomcat,JBOSS等)之间移植。

但是,您被锁定在Spring中。

Spring鼓励采用良好的OO设计规范(例如,界面,层次,关注点分离),使他们接触的任何问题都受益,即使您决定改用Guice或其他DI框架。

更新:该问题和答案在2014年已有5年历史了。需要说明的是,那时编程和应用程序开发的世界已发生了很大变化。

它不再只是在Java或C#,Spring或EJB之间进行选择。使用vert.x可以完全避开Java EE。您可以在没有应用服务器的情况下编写高度可扩展的多语言应用程序。

更新:现在是2016年3月。Spring Boot提供了一种无需Java EE应用程序服务器即可编写应用程序的更好方法。您可以创建一个可执行的JAR并在JVM上运行它。

我想知道Oracle是否会继续支持Java EE规范。Web服务已取代EJB。EJB解决方案已失效。(只是我的观点。)


7
在我看来,“锁定”这个词对描述Spring来说太强了。毕竟,Spring的设计是将所有东西粘合在一起,而不是替换它们,您始终可以选择要与之集成的东西。此外,所有内容都具有锁定功能,即使最简单的Apache Commons也可以将我们锁定,但我们仍每天都在使用它。
Christopher Yang

3
对于VMWare / Spring,没有其他供应商可以在Oracle,Red Hat和IBM for Java EE平台之间进行选择。这就是我的意思。这不是对Spring的功能或有用性的评论。我碰巧非常喜欢它。我每天都用它,晚上睡觉。
duffymo 2013年

1
@ChristopherYang是正确的。我的意思是,“ Java”将成为供应商的锁定对象。因此,最终,我们只需要停止争论并完成工作即可。:-)
cbmeeks 2013年

4
这个问题将近五年了。就我个人而言,我认为EJB是过时的技术,已经在所有方面都输给了HTTP Web服务。简单而开放的胜利。给我REST服务,您就可以保留EJB。Spring很好地支持了它们。那就是世界的去向。
duffymo 2014年

1
谢谢回复。只是在评估从现有EJB 2.1应用程序迁移的更好版本(SPRING,EJB 3.x)中寻找好处。另一个问题是,EJB 3.x也支持WebService。那么,我们可以从Java应用程序分发的JNDI / RMI和其他应用程序的WS中受益吗?
noboundaries 2014年

48

首先,让我说清楚一点,并不是说您不应该使用Spring,而是因为您要寻求一些优势,所以至少有两个优势:

  • EJB 3是一个标准,而Spring不是(它是事实上的标准,但这不是同一回事),并且在可预见的将来这不会改变。尽管可以将Spring框架与任何应用程序服务器一起使用,但是Spring应用程序既被锁定在Spring本身中,也被锁定在您选择要集成到Spring中的特定服务中。

  • Spring框架位于应用程序服务器和服务库的顶部。服务集成代码(例如,数据访问模板)位于框架中,并向应用程序开发人员公开。相反,EJB 3框架已集成到应用程序服务器中,而服务集成代码则封装在接口后面。因此,EJB 3供应商可以通过在应用程序服务器级别上工作来优化性能和开发人员体验。例如,他们可以将JPA引擎与JTA事务管理紧密联系在一起。另一个示例是集群支持,它对EJB 3开发人员是透明的。

尽管EJB 3并不是完美的,但它仍然缺少一些功能(例如,注入非托管组件,例如简单的POJO)。


1
教育性的答案,但是我想知道为什么/何时需要插入一个简单的POJO而不是初始化一个新的POJO?
奥马尔法鲁克Almalı

4
用于测试目的。
菲利普

22

帕斯卡的积分是有效的。但是,以下是支持Spring的内容。

  • EJB规范实际上有点宽松,因此可以在不同的应用程序服务器上观察到不同的行为。当然,在大多数情况下并非如此,但是对于某些“暗角”,我遇到了这样的问题。

  • Spring有很多额外的优点,例如弹簧测试,AOP,MVC,JSF集成等。EJB具有其中的一些优点(例如,拦截器),但是我认为它们没有那么完善。

总之,这主要取决于您的具体情况。


也许像Spring这样的东西只需要一个servlet引擎会更准确(EJB可以在任何JEE容器中使用,servlet引擎!= JEE容器)。
Pascal Thivent 09年

1
嗯,从技术上讲,Spring也不需要servlet引擎。例如,spring-test使用内存上下文。
博佐

3
嗯,从技术上讲,如果您采用这种方式,那么EJB不需要独立的容器。从EJB 3.1开始,存在EJBContainer.createEJBContainer()使用嵌入式容器的标准API。因此,您的陈述仍然是错误的。
Pascal Thivent,2009年

好的,3.1是一个很新的东西,显然我忘记了这些添加。从我的答案中删除了这一点。
博佐

-30

Spring是为了补充EJB,而不是替代它。Spring是EJB之上的一层。众所周知,EJB的编码是使用API​​完成的,这意味着我们必须使用Spring框架在API中实现所有功能。我们可以创建样板代码,然后只用该样板,向其中添加一些内容,然后一切就完成了。在内部,Spring与EJB连接- 没有EJB不会存在Spring。

使用Spring的主要优点是,类之间完全没有耦合。


8
您完全错了,对不起
Jakub H

2
对不起@sasi这甚至还没有接近一个正确的或者好的答案.......
普拉卡什

4
“没有EJB,春天就不会存在。” 老兄,你是真的吗?您一生中是否曾在EJB声明中使用过“ \ @Stateless”,或在注入中使用过了\ @EJB注释?您是否认为这些可以在Jetty或Tomcat中使用?您如何看待春季交易?您知道可以将Spring应用程序部署到Servlet容器中吗?
99Sono 2015年

抱歉,但您对两者都没有很好的结构化理解,EJB是Java EE的一部分,而spring是约定优于配置的原理。实际上,如果您不深入研究,您可能最终会认为它们是同一事物或事物之间的联系或相似程度。为什么?它们都有类似注入的相似性,但是它们之间的差异是巨大的。的确,由于EJB的复杂性,Spring作为EJB的后代诞生了,但是事实并非如此。在Java EE 5(EJB 3)时代已经足够好了,并且也像春天使用其COC一样进行了修改
Ishimwe Aubain Consolateur
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.