一起学习
今天, 对企业开发人员来讲, 难以编写分布式商务应用程序和其它任何较大的应用程序是他们所面临着一个共同问题。如果一个应用程序是分布式的,或在网络中以多重形式出现,那它必然应该是一个综合化的产物。如果一个应用程序必须可靠而有保证地执行它的商务逻辑,
那么其综合化程度又必然需要进一步提高。
企业所面临的另一个复杂问题是企业自身的基本操作环境也是多种多样的。另外, 企业希望能以尽可能快的速度建立自己的应用程序, 而不是被限制在单一的平台上。理想的情况是,
企业开发人员只编写一次应用程序, 而该程序即可在任意平台上运行。企业JavaBeansTM技术就是希望提供这种能力。
企业JavaBeans(EJB)的组件结构是以作为可重复使用的服务器端组件而设计的,它使企业能够建立可升级、安全可靠、可运行于多重平台且以商务为重点的应用程序。本文描述了EJB组件模型的含义和结构,并且给出了一个EJB组件如何工作的实例。
- 什么是企业JavaBeans技术?
- EJB技术的设计目标
- 企业应用程序模型
- 特性
- 开发人员的角色分配
- 开发过程
- EJB的未来
- 结论
什么是企业JavaBeans技术?
EJB结构是JavaTM平台上的服务器端组件模型。设计EJB结构的目的是, 通过使企业开发人员将注意力只集中于编写商务逻辑, 从而解决上面所提出的问题。EJB技术取消了编写"全程(plumbing)"
码的要求。例如, 企业开发人员不再需要编写那些处理事务行为、安全、连接共享或线程的代码, 因为EJB体系结构将这些任务委托给服务器厂商完成了。
对用户和这一技术的实现者来说, 将会获得如下收益:
- 生产效率: 使用这一技术, 企业开发人员将会进一步提高生产效率。他们不仅能够获得在Java平台上的开发成果, 而且能够将注意力集中于商务逻辑,
从而使效率倍增。
- 业内支持: 试图建立EJB系统的客户会获得一系列可供选择的解决方案。企业JavaBeans技术已经被多达25个公司所接受、支持和应用。
- 投资保护: 企业JavaBeans技术建立在企业现存系统之上。事实上, 许多EJB产品都将建立在已有的企业系统之上。今天企业所使用的系统,
明天将会运行企业JavaBeans组件。
- 结构独立: 企业JavaBeans技术将开发人员和底层中间件相隔离; 开发人员看到的仅仅是Java平台。 这一点除下面将要谈到的交叉平台的好处外,
还将使得EJB服务器厂商在不干扰用户的EJB应用程序的前提下, 有机会改进中间件层。
- 服务器端仅写一次, 即可随处运行(Server-Side Write Once, Run AnywhereTM): 通过对Java平台的支持,
EJB技术将"仅写一次, 随处运行"的概念提高到了一个新的水平。它可以保证一个EJB应用程序可运行于任何服务器, 只要这个服务器能够真正提供企业JavaBeans
APIs。
EJB技术的设计目标
服务器端环境和其所需工具极大地影响了EJB技术的设计目标。 一个主要的设计目标是减少(尽可能地)建立分布式应用程序的过程;它是通过将一般需要手工编码的特性转化为企业Beans简单声明属性来实现的,
这些声明属性使开发效率大大提高, 因为某些行为, 如安全和事务不是以代码形式, 而是通过Bean自身的"标记" 来设定的,。这种设计特性也是EJB技术使开发人员将注意力集中于编写商务逻辑的另一条途径。
EJB规范创建了一种底层结构, 它关系到系统级编程, 如事务、安全、线程、命名、对象生命周期、资源共享、远程访问和persistence等等;它同时也简化了访问现存应用程序的过程,
并为工具的创建和使用提供了统一的应用程序开发模型。
企业应用程序模型
除提供底层结构以外, EJB技术还涉及到另外一个问题。有两种建立企业应用程序的基本模型。在第一个模型中, 客户是从作为一个应用程序的对象开始对话期的;
该对象可代表客户执行一项工作, 有可能包括多重数据库事务;在第二个模型中, 客户访问一个对象, 这个对象代表了数据库中的一个实体。EJB的设计适用性很广,
它包括了这两种模型:
- Session Beans包括了第一种模型。一个Session Bean是一个对象, 它代表了与客户的一个瞬时对话, 并为客户执行数据库读写操作;这些数据库的访问是在一个事务处理过程中实现的。一个Session
Bean的字段包括对话的状态且是瞬时的,之所以如此的意义在于, 一旦服务器或客户崩溃, Session Beans就不存在了。该模型典型地用于数据库编程语言,
如PL/SQL。
- Entity Beans包括了第二种模型。一个Entity Bean与作用于一个数据库中的数据的方法一起代表了这些数据。在关系型数据库中,
例如一个雇员信息表格, 表中的每一行都有一个Bean。Entity Beans是事务型的且长寿, 只要数据库中的数据存在, 则Entity
Bean就存在。该模型大多数典型地应用于面向对象的数据库中。
请注意在EJB规范中, 支持Session Beans是强制性的, 而支持Entity Beans在目前是选择性的; 但在EJB规范2.0版中,
它将成为强制性的。
EJB 结构
上图显示了EJB技术的体系结构。EJB规范支持任何类型的客户, 因为该规范不强制要求任何远程对象的"网线"协议;这就意味着一个服务器可支持多种协议,
如RMI、IIOP(CORBA)和DCOM等;它也说明, 一个EJB服务器的客户程序不一定要用Java语言来编写。
EJB服务器实际是各种支持EJB安装的服务的集合, 这些服务包括分布式事务管理、分布式对象管理和对这些对象的分布式调用以及低层次系统服务。简而言之,
EJB服务器管理那些支持EJB组件所需要的资源。一个EJB服务器提供商可提供一个容器的实现(详情见后), 他也可以为第三方厂商提供API以使其能嵌入附加EJB容器。EJB规范在服务器的设计和实现上给了开发人员以极大的自由。
EJB服务器正象是EJB组件的一个家, 而容器则是Bean生活的地方, 就象是一个记录"生活"在数据库中一样。它提供了一个可升级、安全和事务性的环境,
在该环境中Bean可以操作。处理对象生命周期(包括创建和销毁一个对象)的正是容器。容器也负责Bean的状态管理。
容器对客户是透明的, 容器上没有客户API。当一个Bean被安装在容器中时, 该容器提供两种实现: Bean的EJBHome接口的实现(详情见后)和Bean的远程接口的实现。容器也负责保证在JavaJNDI
中能够获得Bean的EJBHome接口。
要构造一个Bean, 你必须首先实现商务方法。 例如, 如果你正在编写一个帐目检查Bean, 你可能要实现一个"借方"方法用来作为接口的一部分;你还必须实现两种类型的EJB接口之一
--Session Bean或Entity Bean;这些接口包括了诸如与工作设置管理相关的方法并且不暴露给客户。
当把一个Bean安装在服务器上时, 远程接口(在CORBA中通常称作skeleton)则被自动生成。远程接口的实现被称为EJBObject,
它只将程序员指定的远程接口暴露出来。尽管企业Bean类包含了同样的方法, 但它并不实现远程界面。 EJBObject的作用就象是一个代理人,
它截取远程对象调用并调用企业Bean实例中的适当的方法。
一个EJB容器可实现安装在该容器中的每个企业Bean的EJBHome接口, 它允许Bean的创建和清除, 并且可查询有关Bean的信息或"元数据"。该容器使客户通过JNDI便可获得EJBHome接口。对Entity
Beans来说, EJBHome接口也包含了一个或多个"finder"方法, 使客户用一个主键即可查询有关Bean的信息。
特性
应用程序开发人员所面临的最复杂的问题之一是编写分布式事务应用程序。EJB技术的一个主要特性就是它对分布式事务的支持;EJB技术使你可编写访问跨越多个EJB服务器的多重分布式数据库的应用程序。为使这一工作变得简单,
EJB规范允许你在部署阶段就以声明的形式指出事务行为, 而管理事务行为的负担被转移给服务器, 特别是转移给容器和EJB服务器提供者。如果Bean的开发人员有更高的事务需求,
则可使Bean通过程序来管理事务界限。
安全是所有企业产品的需求。EJB组件模型充分发挥了核心Java平台安全模型的作用, 从而给予你两种设置安全的方法。第一, 你可以在Bean的EJB-JAR文件中设置安全描述符;
第二, 你可以使用java.security包实现对安全的程序化管理。
EJB的另一个设计特性是独立于对象的通信协议。这有许多好处, 首先, 它可以使编写客户端应用程序的程序员免于选择通信协议; 其次, 它允许EJB服务器的建立者实现对其用户最为重要的协议。例如,
ORB提供者可能仅仅实现CORBA协议, 而UNIX提供者则可能实现RMI和CORBA协议。但无论如何, 所用协议对Bean的开发人员是透明的,
他仅仅针对Java平台来编写程序。
Java平台为EJB服务器提供了许多继承性的优点。最明显的一点是, 一旦基于Bean的应用程序编成后, 它便可以在任何可运行企业Bean服务器的地方运行;其连带的优点是升级性。如果你目前的EJB应用程序在性能上出了问题,
你可以将应用程序的主要部分移植到另一个更高性能的平台的EJB服务器上。
专用容器可大大简化对现存企业应用程序的访问。这样的容器可使现存非Java语言应用程序作为Bean出现, 它使Java开发人员可在不了解现存系统和应用程序特点的情况下访问那些应用程序。
开发人员的角色分配
EJB技术将开发人员分成固有的五种角色: 服务器提供者、 容器提供者、 企业Beans提供者、 应用程序装配者和部署者。对上述五种角色描述如下:
- 服务器提供者是分布式事务管理方面的专家, 主要负责处理分布式对象和低层次系统服务。数据库和TP监控器厂商可典型地充当该角色。
- 容器提供者一般是系统编程方面的专家, 由于容器有能力将EJB环境与现存应用程序(如SAP R/3和CICS)桥接起来, 因而这些专家有可能具备某一应用领域的经验。由于容器为Bean提供了安全、可升级和事务性的环境,
因而容器提供者需具备这些领域的经验。数据库和事务服务器厂商也适合这一角色, 并可提供标准容器。
- 企业Beans提供者为EJB应用程序提供"积木", 他们是典型的以Bean的形式编写商务逻辑的域专家,而他们不一定是数据库或系统编程方面的专家。他们生成包括所有组件在内的EJB
JAR文件。对象库厂商适合这一角色。
- 应用程序装配者是域专家, 他们的工作是用第三方Beans建立应用程序, 他们也有可能建立客户端GUI。典型的应用程序装配者通常是程序员,他们建立应用程序来可访问已部署的组件。
- 部署者通常熟悉企业的操作环境, 他们利用应用程序包并设置部分或全部应用程序的安全和事务描述符。部署者也有可能使用工具来修正Bean的商务逻辑。
开发过程
值得注意的是, 有几种不同的建立EJB应用程序和组件的方案。开发过程的不同主要取决于是否编写session Bean、entity Bean和应用程序或上述三项的某种组合。
考虑一个有关帐目检查并编写session Bean的简单方案。 建立EJB组件的开发过程是简单的: 首先, 你应该使用IDE(如Java
Workshop, Cafe 或JBuilder)为你的Bean或基于Bean的应用程序编写商务逻辑;编译后, Beans被打包到一个EJB
JAR文件中, 它与常规的JAR文件相似, 但包含了一个序列化的DeploymentDescriptor类实例, 其中包括了对安全、事务行为等的设置;然后,
你应该使用服务器厂商提供的部署工具在EJB服务器上安装Bean。至此, 部署者(如数据库管理员)将设置Bean在特定站点的属性, 如事务模式或安全等级。一旦Bean被安装到了服务器上,
则客户可调用实例的远程方法。
请看一个有关电子商务的例子-- 一个网上"购物车"。考虑一下你将如何建立一个购物车Bean? 或许你应该从建立Bean的远程接口开始:
public interface ShoppingCart extends javax.ejb.EJBObject{
boolean addItem(int itemNumber) throws
java.rmi.RemoteException;
boolean purchase() throws java.rmi.RemoteException;
}
这个接口定义了两个方法: additem()用于向购物车中增加物品, purchase()用于完成这笔交易。一旦公共接口的定义完成,我们必须编写Bean的类:
public class ShoppingCartEJB implements SessionBean{
public boolean addItem(int itemNumber){
// the code for adding items to the cart
// may include JDBC code.
}
public boolean purchase(){
//the code for purchases
}
public ejbCreate(String accountName, String account){
// object initialization code
}
}
请注意, 企业Bean类不实现Bean的远程接口, 它是由EJBObject来完成的。另外, session Bean不支持自动的persistence。因而,
显式数据库访问必须在其方法中实现。例如, 在purchase()方法中, JDBCTM调用可被用来更新数据库, 而由容器在安装时生成的EJBObject可实现远程接口;EJBObject的作用就象是一个"代理人",
它将方法调用传递给安装在服务器中的Bean实例。
客户做的第一件事是使用JNDI为所需要的Bean定位EJBHome。在本例子中, EJBHome对象可能以下列形式出现:
public interface CartHome extends javax.ejb.EJBHome{
Cart create(String customerName , String account)
throws RemoteException, BadAccountException;
}
CartHome接口包含一个create()方法, 当客户请求一个新的Bean的时候该方法将被调用。请注意, 这个方法是在EJBObject中实现的并将在被调用时调用Bean类中的ejbCreate()方法。
ShoppingCart类的EJBHome对象可使用下列代码来定位:
Context initialContext = new InitialContext();
CartHome cartHome = (CartHome) initialContext.lookup
("application/mall/shopping-carts");
在本例中, 调用InitialContext()以得到JNDI命名层次的根;lookup()方法被用来得到CartHome。 在此种情况下,
'applications/mall/shopping.carts'是JNDI到达你感兴趣的CartHome的路径。此时, cartHome持有了ShoppingCartEJB的EJBHome对象的引用。然而,
请注意客户的JNDI的命名空间可能被设置为包括分布于网络上的多种机器上的EJB容器; EJB容器的实际位置一般来说对客户是透明的。
下例显示了客户是如何使用EJBHome对象并调用方法的:
ShoppingCart cart = cartHome.create("Emma","0507");
Cart.addItem(100);
Cart.addItem(251);
Cat.purchase();
在上述代码中, create()方法创建了一个新的session Bean, 变量cart 包括了一个对远程EJB Object的引用, EJB
Object允许你调用它的方法additem()和purchase()。cartHome中的create()方法将调用对应的Bean中的ejbCreate()方法。
EJB的未来
EJB规范1.0是在1998年JavaOne大会期间发布的, 它为建立分布式商务对象系统提供了坚实的结构体系基础, 它不应该被认为是这一研究主题的结束,
而应该是进一步完善这一体系结构的开始。该规范的一些内容还需改进, 特别是处理persistence对象的EJB模型。另外, 还应考虑标准化开发工具和开发系统之间的协定,以为所有开发环境提供统一的调试界面。
将来, SunMicrosystem还将研究兼容性问题。有两个领域涉及到兼容性问题, 一是"EJB兼容的"服务器到底是由什么组成的?
一个兼容性计划有望在不久的将来出现; 二是保证不同厂商的EJB服务器具有相互操作性。Sun正在就这些问题征求其合作伙伴的意见, 以决定如何发展。
结论
企业JavaBean技术为我们提供了一种开发、部署和管理分布式商务应用程序的新途径。它使开发人员编写作为可重复使用的服务器组件的分布式商务应用程序变得更简单,
并且不必担心系统级编程问题。企业JavaBean组件结构代表了在简化企业应用程序的开发、部署和管理方面的一个巨大进步。有关企业JavaBean技术的完整描述,
请访问企业JavaBean的网。
下载本文示例代码
企业JavaBeansTM技术介绍企业JavaBeansTM技术介绍企业JavaBeansTM技术介绍企业JavaBeansTM技术介绍企业JavaBeansTM技术介绍企业JavaBeansTM技术介绍企业JavaBeansTM技术介绍企业JavaBeansTM技术介绍企业JavaBeansTM技术介绍企业JavaBeansTM技术介绍企业JavaBeansTM技术介绍企业JavaBeansTM技术介绍
阅读(116) | 评论(0) | 转发(0) |