EJB教程

  • 格式:pdf
  • 大小:1011.48 KB
  • 文档页数:52

服务框架

EJB并不是一个产品。它是Java服务器端服务框架的规范,软件厂商根据它来实现EJB服务器。

应用程序开发者可以专注于支持应用所需的商业逻辑,而不用担心周围框架的实现问题。

EJB规范详细地解释了一些最小但是必须的服务,如事务,安全和名字等。软件厂商根据这些规

范要求以保证一个enterprise bean能使用某个必需的服务。规范并没有说明厂商如何实现这些

服务。这使得通过阅读规范来学习EJB更加困难,因为它允许厂商在不牺牲核心服务的可移植性的前提下来提供一些增强功能。

JavaBeans和Enterprise JavaBeans

JavaBeans是Java的组件模型。在JavaBeans规范中定义了事件和属性等特征。Enterprise 

JavaBeans也定义了一个Java组件模型,但是Enterprise JavaBeans组件模型和JavaBeans组

件模型是不同的。 JavaBeans重点是允许开发者在开发工具中可视化的操纵组件。JavaBeans

规范详细地解释了组件间事件登记、传递、识别和属性使用、定制和持久化的应用编程接口和语

意。 Enterprise JavaBeans的侧重点是详细地定义了一个可以portably地部署Java组件的服务框架模型。因此,其中并没提及事件,因为enterprise bean通常不发送和接受事件。同样也

没有提及属性------属性定制并不是在开发时进行,而是在运行时(实际上在部署时)通过一个

部署描述符来描述。

不要寻找JavaBeans和Enterprise JavaBeans之间的相似性。他们都是组件模型规范,但是前

者说明了开发工具中应用程序组装的问题,而后者则侧重于部署组件的服务框架的细节。不要错误地认为JavaBeans是用于客户端的开发,Enterprise JavaBeans是用于服务器端的开发。

JavaBeans也可作为进行非图形化服务器端Java应用开发的组件模型。区别是当你使用

JavaBeans创建服务器应用时,你还得设计整个的服务框架。用Enterprise Javabeans框架是

现成的,你只需遵守它的APIs.对于复杂的服务器端应用程序,显然使用Enterprise JavaBeans

比重新开发更简单。

Enterprise JavaBeans体系结构

EJB服务器是管理EJB容器的高端进程或应用程序,并提供对系统服务的访问。EJB服务器也可以提供厂商自己的特性,如优化的数据库访问接口,对其他服务(如CORBA服务)的访问,对

SSL 3.0的支持等。一个EJB服务器必须提供对可访问JNDI的名字服务和事务服务支持。一些

可能的EJB服务器的例子如:

・数据库服务器 

・应用服务器 

・中间件服务器 

EJB容器是一个管理一个或多个EJB类/实例的抽象。它通过规范中定义的接口使EJB类访问所需的服务。容器厂商也可以在容器或服务器中提供额外服务的接口。

现在没有EJB服务器和EJB容器间接口的规范。因为目前容器通常由EJB服务器来提供,所以

一旦接口标准化了,厂商就可能提供可以在任何兼容的EJB服务器上运行的容器。

Home接口列出了所有定位、创建、删除EJB 类实例的方法。Home对象是home接口的实现。

EJB类开发者必须定义home接口。容器厂商应该提供从home接口中产生home对象实现的方法。 远程接口(remote interface)列出了EJB类中的商业方法。EJBObject实现远程接口,并且客户

端通过它访问EJB实例的商业方法。EJB类开发者定义远程接口,容器开发商提供产生相应的

EJBObject的方法。客户端不能得到EJB实例的引用,只能得到它的EJBObject实例的引用。当客户端调用一个方法,EJBObject接受请求并把它传给EJB实例,同时提供进程中必要的包装功

能。客户端应用程序通过home对象来定位、创建、删除EJB类的实例,通过EJBObject来调用

实例中的商业方法。客户端可以用Java来编程,通过Java RMI来访问访问home对象和EJBObject,

或用其他语言编程并通过CORBA/IIOP访问,使得部署的服务器端组件可以通过CORBA接口

来访问。

上图是Enterprise JavaBeans体系结构的一个描述。下一节详细讨论了每个组件的细节。

理解EJB组件

你现在应该已经熟悉了整个EJB体系结构及其主要的部件。这一节更详细地描述了这些

部件,并解释它们运行时的行为语意。

Home接口

EJB库使用enterprise bean的客户端通过它的home接口创建它的实例。Home接口包含一

个或多个用来创建enterprise bean实例的create()方法。这个home接口不是由bean来 实现,而是通过称为home object的类来实现。一个home object的实例在服务器中实例

化,使得客户端可以访问它们。

定位home object 一个home object的引用被放在名字服务中,客户端能通过JNDI访问

它。EJB服务器一般提供某种名字空间的实现,虽然有时可以使用外部的名字空间。在

这两种情况下客户端都必须知道名字空间的位置以及JNDI的上下文类。例如,一个客户 端的applet可能接收名字空间和JNDI上下文类作为applet的参数。 除了提供位置和类名,客户端也必须知道在名字树中定位home object.这些必须在客户

端启动时提供。当部署者把enterprise bean部署进EJB服务器中时,他必须可以以参数

形式指定名字树,如ejb/accounting/AccountsPayable.客户端必须获得这个完整的路 径名来定位并获得AccountsPayable home object的引用。并不是说客户端通过JNDI获

得容器。客户端使用JNDI查找home接口的实现。Home接口的实现由某个特殊的

container来提供,但这是该容器厂商的细节,enterprise bean开发者和客户端应该忽

略它。

Home接口中的方法 Enterprise bean开发者定义ejbCreate()方法的同时必须在home接口中声明与其相应的

create()方法。实体bean可以包含finder方法以使得客户端能定位已有的实体bean.

Home接口是通过继承javax.ejb.EJBHome来定义的。该接口包含如下的方法:

public interface javax.ejb.EJBHome extends Remote { public EJBMetaData getEJBMetaData() throws RemoteException;

public void remove(Handle handle) throws

RemoteException,RemoveException;

public void remove(Object primaryKey) throws

RemoteException,RemoveException; 一个bean的home接口可以象下面这样:

public interface myHome extends EJBHome {

public myRem create() throws RemoteException,CreateException;

public myRem create(String str) throws

RemoteException,CreateException; 其中

public interface myRem extends EJBObject { … }

容器开发商负责提供实现home接口的home对象,因为只有开发商才能实现存贮

enterprise bean的库的编码。 容器

定义容器在理解EJB规范时容器这个术语并不应从字面上简单地理解为类,而是一层代

替bean执行相应服务的接口。容器开发商提供运行在EJB服务器中一套完成这些功能的

工具和接口。 这些服务包括:

·与二级存储中交换(对会话bean)

·持久性管理(对实体bean)

·实现创建和查找服务的home object的可用性 ·在可通过JNDI访问的名字空间home object的可视性

·正确的创建、初始化和删除bean

·保证商业方法正确地运行在事务上下文中

·实现某一基本的安全服务

·从home object和EJBObject上的RMI上产生stub和skeleton

容器和EJBObject对规范经常引用由容器或EJBObject提供的服务。这些服务只是用来说

明而不暗示特殊类的服务需求。支持enterprise bean的EJBObject和容器类都由容器开 发商提供。这些类必须完成bean容器的功能。对bean来说容器和EJBObject是不同的入

口点,对某个特殊的服务提供支持独特的能力。例如,容器通过读部署描述符来知道应

用于bean方法的事务属性。然而,这些商业方法通过EJBObject调用。

EJBObject必须与容器通讯来确定调用商业方法的事务上下文。确定以后,EJBObject在

调用商业方法以前建立事务上下文。重要的是EJBObject 和容器的协同工作来实现容器 所需的事务。容器厂商提供二者的实现,但对二者的功能分割却是自由的。与home接口

的关系

目前厂商提供工具来读home 接口并产生作为容器的home object.在这种情况下厂商对

每个enterprise bean类使用不同的容器类。容器厂商可以使用其它的实现策略,如一

个容器类实现多个home接口,甚至一个标准的容器类创建独立的home object实现。唯 一的必要条件是容器厂商必须使客户端能通过JNDI访问home object. 客户端和bean开

发者都不需关心容器和home object的实现细节。

Enterprise JavaBean

Enterprise bean是开发者编写的提供应用程序功能的类。开发者可以选择创建会话 bean或实体bean,通过实现不同的接口声明其部署描述符来加以区分。

对于会话bean:

public class myBean implements javax.ejb.SessionBean … 对于实体bean:

public class myBean implements javax.ejb.EntityBean … 客户端不会直接访问enterprise bean中的任何方法。客户端通过EJBObject 间接调用

bean中的方法,EJBObject就象一个代理一样。在把调用通过EJBObject传递时,容器开

发商通过包装编码插入其自己的功能,这称为方法插入。方法插入的一个例子是为每个

方法调用创建一个新的事务上下文,当方法返回到EJBObject时提交或回滚事务。

当容器厂商的工具在安装bean产生stub和skeleton时,它产生bean的EJBObject一个 stub和skeleton.实际上它并不创建bean本身的stub和skeleton,因为bean不会通过网