Java Spring vs EJB。Spring能取代EJB吗?

Java Spring vs EJB。Spring能取代EJB吗?,java,spring,ejb-3.0,Java,Spring,Ejb 3.0,因为它能够像这样使用事务。对我来说,Spring能够取代使用EJB的要求。谁能告诉我使用EJB的额外优势是什么 首先,让我明确地说,我不是说你不应该使用Spring,而是因为你要求一些优势,这里至少有两个: EJB3是一个标准,而Spring不是(它是一个事实上的标准,但这不是同一件事),在可预见的将来这不会改变。尽管您可以将Spring框架用于任何应用服务器,但Spring应用程序被锁定在Spring本身和您选择在Spring中集成的特定服务中 Spring框架位于应用服务器和服务库之上。服

因为它能够像这样使用事务。对我来说,Spring能够取代使用EJB的要求。谁能告诉我使用EJB的额外优势是什么

首先,让我明确地说,我不是说你不应该使用Spring,而是因为你要求一些优势,这里至少有两个:

  • EJB3是一个标准,而Spring不是(它是一个事实上的标准,但这不是同一件事),在可预见的将来这不会改变。尽管您可以将Spring框架用于任何应用服务器,但Spring应用程序被锁定在Spring本身和您选择在Spring中集成的特定服务中

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


虽然EJB3并不完美,但它仍然缺少一些特性(例如,注入非托管组件,如简单POJO)。

Pascal的观点是正确的。然而,有以下几点支持春天

  • EJB规范实际上有点松散,因此不同的应用服务器可以观察到不同的行为。当然,这在大多数情况下是不正确的,但我在一些“黑暗角落”遇到了这样的问题

  • Spring有很多额外的优点,比如Spring测试、AOP、MVC、JSF集成等等。EJB有一些(例如拦截器),但在我看来,它们并没有那么发达


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

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

如果使用EJB有一个“优势”,我会说这将取决于您团队的技能。如果您没有Spring方面的专业知识,也没有很多EJB经验,那么坚持使用EJB3.0可能是一个不错的选择

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

Spring可以轻松地在应用程序服务器(例如WebLogic、Tomcat、JBOSS等)之间进行端口连接,因为它不依赖于它们

但是,您被锁定在Spring中

Spring鼓励良好的OO设计实践(例如,接口、层、关注点分离),即使您决定切换到Guice或另一个DI框架,这些实践也会使他们遇到的任何问题受益

更新:这个问题和答案在2014年已经有五年历史了。需要指出的是,编程和应用程序开发的世界在当时已经发生了巨大的变化

它不再只是Java或C#,Spring或EJB之间的选择。有了它,就可以完全避免JavaEE。您可以编写高度可伸缩的, 没有应用服务器的polyglot应用程序

更新:现在是2016年3月。SpringBoot提供了一种在没有JavaEE应用服务器的情况下编写应用程序的更好方法。您可以创建一个可执行JAR并在JVM上运行它


我想知道Oracle是否会继续支持JavaEE规范。Web服务已经接管了EJB。EJB解决方案已经过时了。(只是我的观点。)

Spring是对EJB的补充,而不是取代它。Spring是EJB之上的一层。正如我们所知,EJB的编码是使用API完成的,这意味着我们必须使用Spring框架在API中实现所有内容。我们可以创建锅炉板代码,然后拿着那个板,添加一些东西,然后一切都完成了。Spring内部与EJB连接--没有EJB,Spring就不存在。


使用Spring的主要优点是类之间根本没有耦合。

也许像Spring这样的东西只需要一个servlet引擎就更准确了(EJB可以用于任何JEE容器,servlet引擎!=JEE容器)。从技术上讲,Spring也不需要servlet引擎。例如,spring测试使用内存上下文。从技术上讲,如果您这样做,EJB也不需要独立的容器。从EJB3.1开始,就有标准的
EJBContainer.createEJBContainer()
API来使用嵌入式容器。所以,尽管如此,你的说法是错误的。好吧,3.1是相当新的,显然我忘记了添加的内容。从我的回答中删除了这一点。在我看来,“锁定”这个词太强了,无法形容春天。毕竟,Spring的设计目的是将所有东西粘合在一起,而不是替换它们,您可以随时选择要与之集成的内容。此外,任何东西都有锁定,即使是最简单的Apache Commons也会锁定我们,但我们每天都在使用它。VMWare/Spring没有替代供应商,您可以在Oracle、Red Hat和IBM for Java EE平台之间进行选择。这就是我的意思。这不是对Spring的功能或用途的评论。我碰巧非常喜欢它。我每天都用它,晚上睡觉。@ChristopherYang说得对。我的意思是,“Java”将是一个供应商锁定。所以最终,我们只需要停止争论,做点事情。:-)这个问题差不多有五年历史了。就我个人而言,我认为EJB是过时的技术,在各个方面都输给了HTTP web服务。简单和开放的胜利。给我REST服务,你可以保留你的EJB。弹簧很好地支撑着它们。这就是世界的去处。谢谢你的回复。我只是在找那个人