分类:
2008-09-09 17:24:37
企业级Beans(EJB)是J2EE平台中最复杂的技术之一,因此一些开发人员不愿意在他们的项目中部署EJB.
本文面向那些仍旧对是否投入时间和精力学习并在他们的项目中部署EJB技术持观望态度的开发人员。首先,我们介绍了EJB的优点和缺点,然后,说明了何时你可能需要或不需要使用EJB.
最后通过说明我对EJB错误观念一些看法得出结论。
优点
规范:EJB是一项技术规范的技术。(这既是EJB的主要优点也是一个主要缺点。)EJB规范几乎描述了实现的所有方面,包括数据类型,组件生命周期,角色分配以及很多其它方面。
与J2EE紧密结合:J2EE平台中有一组完整的技术,包括EJB和其它非常有价值的技术诸如servlets,Server页,Java消息服务,J2EE连接器体系结构,Java数据库连接,Java认证与授权服务,Java事务API和JavaMail等。这使得J2EE和EJB成为一个很有吸引力的解决方案。
可升级性:只要你将大部分资源管理函数传到应用,供应商就可以运用复杂的升级算法。
可访问资源管理系统:利用EJB容器,你可以获得成千上万行的代码来访问和管理资源,包括事务管理系统,管理系统和目录服务。没有EJB的话,你只能自己实现这些组件。
缺点
大量复杂的规范:对于描述一个复杂分布式系统的规范来说这是很正常的,但是并不是里面的所有信息都需要编码,这使得规范成为一个很不方便的工具。
庞大的文档:在开始开发一个项目之前,你通常需要阅读1000多页的文档,这是部署EJB的很令人畏惧的原因之一。
增加了开发时间:EJB解决方案比普通Java代码实现要求更多的时间。调试EJB代码需要的时间也要比调试普通Java代码长。主要原因是因为你不能确定漏洞是在你的代码中还是在容器中。
EJB代码更复杂:例如,为了实现一个会话bean,你必须编写三个类,一个登录bean,你必须编写四个类。添加一两个部署描述符和一个最简单的“Hello world”应用就会生成10个文件而不是一个文件。
重复设计的危险:这是规范复杂性的后果。如果你没有很好的理解EJB的概念,你就不能有效地使用该技术,而且你还可能把项目变得比实际需要的更复杂。
规范改变:EJB是一项新兴技术,你的代码潜在地存在过时的风险,这就要求增加额外的工作和投入来使得它与新的EJB容器兼容。
什么时候你可能想要使用EJB
假设你有一个使用数据库的简单servlet Web应用。你使用JDBC从你的应用访问数据库。作为一个SQL查询的结果,你会得到拥有一些数据的结果集ResultSet,这些数据代表了你的业务对象。
这种方法使用数据不是很方便。你需要创建一个Java类表示一个数据库结构,你的代码可能如下所示:
MyObjectobj = new MyObject();
obj.setXXX(rs.getString("XXX"));
obj.setYYY(rs.getString("YYY"));
在将结果集换成对象表示与返回后,你需要考虑如何将这个逻辑转移到MyObject中。为了将servlet从JDBC访问细节中分离出来以及不在直接使用java.sql.*包中的类,你应该让该对象可以在数据库中找到自己,然后修改或删除它。
现在又有另外一个问题:如何通过某些查询找到数据库中的一个对象?如果你需要通过主键找到它,那么你需要将主键传给类构造函数即可。如果你需要通过某些准则查找,这将需要很多专用静态方法。如果需要的话,你可能还需要支持事务处理和滚回的方法。
当你的应用程序获得广泛应用时,正常运行时间百分比和可用性将变得十分重要,这时你会需要复制,快速对象持久性,对象高速缓冲区,数据库连接池,事务等等。
所有这些问题都可以由实体企业级Java Beans解决。你不会再犯许多程序员已经犯过的错误。如果你的bean是一个容器管理持久性bean,那么你只需要实现一两个接口,而不必考虑必须访问的数据库。如果不能完全满足你的需要,也没有问题,你可以使用Bean 管理持久性(BMP)实体自己实现持久性。
在你的应用程序业务域中,对象不仅保存数据,还有一些行为。这些行为代表业务逻辑。当你开始编写应用时,所有业务逻辑都存放在servlet中,所以你的应用需要一些servlets的支持。
你可以选择是复制粘贴业务逻辑代码,还是将它放在独立的类中。最后,可能有些用户要求在不同的Web页面中与你的应用进行交互,你需要保存每个用户请求之间的会话信息。解决这个问题的方法称为会话Bean,它封装了你的应用中的所有业务逻辑,它可以是有状态的或是无状态的。
什么时候你可能不想选择EJB
EJB确实是一项很好的技术,但是它并不是一个通用解决方案。EJB提供的很多特性(像安全性、持久性和事务支持)并不是每个应用都需要。
此外,在非分布式应用中你也可能不想使用EJB,因为这种程序速度可能比安全和事务处理更重要。由于EJB的分布式本质,为了便于在客户端和EJB组件(或服务器)之间进行通信,数据必须先进行某种处理(串行化)然后再进行反处理(串行数据并行化)。这导致了大量的开销,使得性能下降,这也是为什么使用JVM(Java虚拟机)中的本地类可能更好些的原因。
关于EJB的几种错误观念
EJB是一项昂贵的技术:这种说法部分正确。但最近已经发布了几个低价位或免费的应用服务,这些应用服务具有商业服务器的所有功能。在一个大型企业应用项目中,应用服务器的花费只是整个项目开销中很小的一部分。
如果使用CMP beans,你就不需要SQL相关知识:这是不正确的。
EJB应用便于在不同的容器之间移植:这种观点部分正确。EJB代码只有在以可移植的方式编写时才能移植。会话beans和BMP beans可以很容易的移植,但是移植CMP beans需要大量的工作。
实体beans工作速度缓慢:基本上是正确的。实体beans确实运行很慢,而且很多情况下,最好将它们转换成会话beans.
结论
对于你的项目在做出是否使用EJB技术决定之前,你需要理解你的应用的所有需求,它的演化前景以及EJB的主要目标和缺陷。