比较分析Struts+Spring+Hibernate和EJB3的异同。越详细越好。

作为一名建筑师,我对EJB和春天又爱又恨。现在就让我们对这两种技术体系做一个全面的分析比较,希望能给你在选择技术时更好的参考。

1.法制VS“民主”

EJB规范一直是由国际组织JCP制定的。一旦被采用,就是官方标准,各厂商都会不遗余力的推广。因此,对于企业应用程序来说,EJB就是法律,基于EJB的基础架构暂时称为法治。Spring来自开源社区,是众多开源软件开发者逐渐形成的流行系统标准。它的设计以IoC(反转控制)为核心,倡导所谓的“零”入侵设计原则,这里暂且称为民主。

支持EJB的应用服务器通常是一个大型的完整产品,包括构建企业应用程序所需的所有方面。如果它需要额外的扩展,一般不容易。如果您对一个应用服务器不满意,您可以并且只能更换整个应用服务器。好在因为应用服务器市场百花齐放,你可以从免费到低端到高端选择。Spring从IoC容器发展而来,通过不断集成AOP,MVC,或者/Mapping以及几乎所有你能想到的服务,提供了一个完美的企业应用框架。对于一个应用程序,可以自由选择具体技术框架的实现。SSH是最常用的组合,但每个架构师是否有能力正确选择并不重要。无论如何,一旦在设计之初就确定了最终的选择,就没那么容易去更换了。你不能简单的把一个基于Spring+Struts的应用移植到Spring+WebWork上。要把一个基于Spring+Hibernate的应用轻松移植到Spring+iBatis就更难了,所以对于需要长期维护和开发的应用,只能希望自己采用的框架能开发好,在升级的同时保证向前兼容。

总而言之,EJB是全世界的标准,就像国际法一样。一旦被遵循,被普遍使用,你就可以在WebSphere、WebLogic甚至JBoss之间轻松切换,所以如果你选择了EJB,你将在一个“合法”的环境中获得最大的民主;春天对全世界来说似乎是民主的,但是一旦整个结构确定了,就变成专制的,就像美国式的民主一样。一旦被征服,就变成了它的独裁。想要摆脱它的控制不是那么容易的。让我们细细品味其中的好处。

2.轻量级组件VS轻量级内核VS轻量级容器

关于轻量级内核,不管是真是假,现在的应用服务器都宣称采用微内核技术,并在此基础上建立Java EE的各种服务,构建一个完美的应用服务器;Spring本身是基于IoC的轻量级内核,然后通过集成第三方服务器提供完整的架构。

EJB组件曾被认为是一个重量级组件,但它受到了批评。EJB3规范的重要目标是简化EJB的开发,并为容器管理提供轻量级的组件解决方案。

但需要提醒的是,轻量级组件并不意味着提供服务的容器是轻量级的。无论是EJB2还是EJB3,应用服务器自然是一个重量级的服务,因为它需要管理组件的生命周期和行为,并提供内置的各种服务。至少目前,现有应用服务器提供的容器还不够轻。个人很喜欢JBoss 2.4。它有我需要的功能,而且足够简单。现在JBoss 4的启动速度已经渐渐让我对它失去了耐心。

对于春天来说,也存在同样的问题。轻量级内核不代表整个框架都是轻量级的,更不代表整个基于Spring的应用架构都是轻量级的。对于Spring,你需要找到并粘合各种服务,然后让它们稳定地协同工作。如果应用程序需要更多的技术和更高的可伸缩性,您将继续向应用程序服务添加其他服务,如资源池、消息队列、集群等等。加上这些,Spring的解决方案就和Java EE应用服务器的解决方案一样重量级了。

追求简单和轻便是每个应用程序架构的目标。对于企业应用的构建,轻量级组件标准+轻量级内核+轻量级容器是构建轻量级应用平台的终极需求。如果有一个轻量级的容器,将有助于EJB3在企业应用中重新获得有利地位。

3.可管理性和可控性

这个问题对于一次性交付的项目可能不是问题,但是对于质量要求更高、生命周期更长的产品,是衡量平台和架构的重要因素。

由于基于Spring架构的应用过于自由和灵活,随着项目的进展,逐渐集成了越来越多的第三方框架,很难保证集成的服务和组件之间是否存在漏洞,甚至严重冲突。然后,很难控制整个项目的质量。仅仅通过一页一页的配置文件,我们就知道以后的维护成本会增加。回想一下EJB2.0时代的ejb-jar.xml。EJB显然比Spring开发的应用程序更可控,因为它集成了所有标准服务,并且组件模型是固定的。此外,应用服务器通常提供一个控制台来查看运行时的属性并实时管理服务。

#p#

4.功能比较

4.1,IoC容器,AOP功能

Spring在IoC中稍微强一点,但是在EJB3中完全可以注入,开发起来简单很多。对于一些相对固定的注入,标注更好,而对于一些可能需要频繁更改的注入,XML更灵活,EJB3正好提供了两个这样的解决方案。如果你已经患上了XML恐惧症,EJB3无疑会帮你缓解。

同时,EJB3组件支持多种注入方式,如依赖名称、接口或JNDI名称。此外,还支持使用@PersistenceContext注入EntityManager,使用@Resource注入服务器资源,如EJBContext、TimerService等。一些注释已经成为JDK6的一部分,将来可能会被JDK直接支持。

关于AOP,如果你需要一个彻底的AOP,在Spring中集成AspectJ,EJB3自然是无法比拟的。但是如果你的项目是基于充分性原则的话,你只需要一般的方法来拦截AOP,EJB3提供的各种回调方法应该可以满足你的要求。

4.2、交易处理

EJB的看家本领,Spring也通过提供TransactionTemplate和集成第三方事务处理器来支持JTA,都支持声明式事务,比如BMT和CMT,但无论如何,移植的器官都没有自己长。

4.3、分布式能力

一般使用Java EE架构的公司都认为这是EJB最大的优势,但实现并不如预期。一方面,大部分是Web应用,Web提供的分布式能力可以满足90%的需求。另一方面,大家基本都是整体部署Web容器和EJB容器,EJB组件的分布式部署很少。当然,如果你需要分别部署Web层和应用层,那么Spring肯定不在你的考虑范围之内。

4.4.集群能力

集群也是EJB的传统优势,但是老师说发挥EJB集群优势的地方不多,因为即使项目中采用了EJB,一般也是用无状态SessionBean代替HttpSession集群。在这种情况下,无论EJB还是春天,大家都是平等的。当然,如果你是在构建一个大规模的应用,对集群能力要求非常高,比如事务级集群,分布式需求,那么估计没有太多因素会让你考虑Web Server+Spring的架构。

4.5、网络服务

EJB3中的Web服务和EJB组件集成得非常好,很容易使用。如下例所示,JAX-WS将逐渐成为Java Web服务事实上的标准。至于Spring,可以实现各种基于Http的远程调用方式,优势并不明显。

@远程

@本地

@ web service(endpoint interface = " jfox . test . EJB 3 . web service . calculator ")

公共类CalculatorBean实现CalculatorRemote、CalculatorLocal {

public int add(int x,int y) {

返回x+y;

}

public int subtract(int x,int y) {

返回x-y;

}

}

4.6、集成的第三方框架

如果需要集成第三方框架,估计需要Spring,当然前提是Spring已经给出了很好的集成方案;但是,如果采用EJB,则取决于具体的应用服务器。建议作为类库使用,或者使用上下文监听器启动。但是,它只能基于特定的应用服务器进行集成。一般来说,应用服务器提供JMX集成能力。

总结

纵观人类历史,如果政府过于强大,必然会迫使人民造反;如果民间力量太强大,社会就会不稳定,这是我们不愿意看到的,在科技界也是一样。对于EJB3和Spring来说,Spring现在处于压倒性的优势。希望EJB3的出现不仅能为政府挽回一些失地,还能继续引发更多的讨论。它不再受一个学派的限制。只有在百家争鸣的环境下,开发者和架构师才能更好的理解企业应用的构建,所以最好的办法就是EJB3和Spring相互促进,和谐发展。

期待真正专注于开发需求的轻量级EJB3应用服务器的出现,为疲软的EJB市场注入新的活力!