Spring 3.0与Java EE 6.0

我遇到了一个情况

我被要求就Spring 3.0和Java EE 6.0之间的Java EE开发方面提供build议。 我曾经是,现在仍然是Spring 2.5的发起人,尤其是JBoss,特别是JBoss,我甚至将旧的应用程序迁移到了Spring,并且影响了开发策略的重新定义,包括Spring特定的API,并且帮助开发一个战略计划来培养像Spring + Tomcat这样更加轻量级的解决scheme,而不是现在的JBoss中较重的解决scheme,现在我们仅仅把JBoss用作一个Web容器,把我称之为“容器内部的容器悖论”也就是说,Spring应用程序和大部分的API都在JBoss中运行,所以我们正在迁移到tomcat。

然而,随着Java EE 6.0的出现,许多function使得Spring在当时具有吸引力,简单的部署,更less的耦合,甚至某种types的DI等似乎都以某种方式被模仿。 JSF 2.0,JPA 2.0,WebBeans,WebProfiles等

所以,问题是…

从您的angular度来看,如果Java EE 6.0提供了新的视angular,那么继续投资于像Spring这样的非标准Java EE开发框架是多么的安全和合乎逻辑呢?

我们可以谈论Spring开发3到4年,还是build议尽早采用Java EE 6.0 API及其实践?

我会欣赏这一切的见解。

恕我直言,关键点不是function之一。 在这方面,Spring将始终领先于JavaEE,因为OpenSource VS很自然。 一个标准。 所以有一个事实,就是Spring早于JavaEE(例如容器集成testing是JavaEE 6中的一个新特性,并且已经在Spring中可用)的早期function。

恕我直言,最重要的一点是pipe理和发展的生命周期之一。 当您selectJavaEE时,您将您的编程模型与您的基础架构联系起来。 通常,应用程序服务器供应商并不是最快采用新标准的版本(blame WebSphere,JBoss,你有什么)。 所以这意味着我们可能不会看到生产准备就绪,JavaEE 6支持大型厂商在年底之前的产品。

即使是这样,那么你仍然要走你的行政pipe理,IT部门和预算控制pipe理者的障碍,愿意升级到这个shiny的新版本。 从这个angular度来看,JavaEE 6甚至不是许多商店的select。 你可以select你想要部署你的应用程序的任何东西? 你想selectGlassfish的生产? 来吧,试试。 大多数商店并不处于这种“舒适”的状态。

恰恰相反:spring。 从基础设施解耦编程模型。 去当前的3.0.x,并在您的Tomcat或遗留应用程序服务器中使用@ @Inject ,JPA 2等。

如果你已经是一家春季店铺,为什么要麻烦转换? 你对此感到满意,它是你想要的,它是积极开发的,你可能不想在Tomcat之外的任何时候运行,因为Tomcat是非常成熟的,并且到处运行。 所以Java EE可能提出的任何可移植的承诺都是正确的。

我看不出有什么理由离开spring。

既然威尔和奥利弗已经说了最重要的东西,我只会补充说:“如果它起作用,完成了工作,那就把它放在一边吧!” “更新”和“标准化”并不总是等于“更好”,实际上很less这样做 – 新事物笨重,而且(这对我来说是最重要的)没有得到广泛的支持。 如果Java EE 6的其余部分与JSF2.0(以及所有的Rich / Ice / Prime / WhateverFaces)一样“标准化”,那么现在就相信我坚持Spring。 许多公司坚持一些古老的技术是有原因的(稳定性*),Spring已经上市多年,已经很成熟了。

@Edit:尤其对于@ymajoros:由于多种原因,JSF(1.x和2.x)是一个有缺陷的标准,仅在less数情况下有用(即,当你创build小的,简单的CRUD网站或者当你是Java EE爱好者):

  • 创造新的组件是一个痛苦的屁股。 既然它是一个基于组件的框架,我会认为它会让事情变得简单不难。 目前我更喜欢在后端方法上使用JS + Java,因为实际上我更容易在那里创build组件。 JSF唯一的节约点是有大量的组件库。 问题在他们不工作时开始,你想改变某些东西或者创build你自己的组件。
  • exception处理是一团糟(或者在过去的一两年里做了些什么改变?)
  • JSF存在过于有状态的问题 – 一些糟糕的决策,一个糟糕的开发项目和一半的应用程序可以是有状态的和序列化的。
  • 标准的UI部分没有(或者至less在我写这个答案的时候没有)覆盖了来自Java的大部分集合(实际上只有体面的数据结构才是List)。

至于你喜欢的标准:他们是否最终以某种方式将JSF与JAX-RS整合在一起? 因为最后我检查了这些规格是完全分开的,尽pipe你可以做很多改进。 例如,为什么我不能在我的支持bean中使用@Path注释一个方法,所以它将被一个REST请求和一个JSF请求处理?

也许这些问题中的一些(所有)问题现在已经解决了,但是当我写这个答案的时候,他们对于JSF和一般标准的所有坏消息只有很less的一部分。

目前,如果我想创build一个非常小,简单的CRUD应用程序,我会使用Play 2.0(即使它是一个巨大的反模式)或类似RoR的东西。 当我想创build一个大的“企业级”应用程序,然后我抓住一个JS框架(如ExtJS)和一个JS组件库与Java后端(例如Spring)结合起来,我做我所需要的,没有任何开销这样做所谓的标准会带来。

当然,JPA2,JAX-RS2等JEE6都有很酷的部分,beanvalidation并不是那么糟糕。 但是,如果仅仅因为他们称之为“标准”(正如我上面提到的,大部分规范甚至没有协同作用)而使用整个标准栈,我认为是错误的。

我想你会注意到使用Spring可以使你比Java EE更有效率。 我不认为他们能够使猪(Java EE)真正飞行。 Java是一个伟大的语言/平台,不要使用Java EE来削弱它。 为什么要解决'某种dependency injection',如果今天可以有spring?