Java 版 (精华区)

发信人: bali (阿奔), 信区: Java
标  题: Enterprise JavaBeans导论二
发信站: 哈工大紫丁香 (2000年09月22日10:56:04 星期五), 站内信件

    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. Ho
me接口是通过继承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对象,因为只有开发商才能实现存贮enterpri
se 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是开发者编写的提供应用程序功能的类。开发者可以选择创建会话bea
n或实体bean,通过实现不同的接口声明其部署描述符来加以区分。
对于会话bean:
public class myBean implements javax.ejb.SessionBean …
对于实体bean:
public class myBean implements javax.ejb.EntityBean …
客户端不会直接访问enterprise bean中的任何方法。客户端通过EJBObject 间接调用b
ean中的方法,EJBObject就象一个代理一样。在把调用通过EJBObject传递时,容器开发
商通过包装编码插入其自己的功能,这称为方法插入。方法插入的一个例子是为每个方
法调用创建一个新的事务上下文,当方法返回到EJBObject时提交或回滚事务。
当容器厂商的工具在安装bean产生stub和skeleton时,它产生bean的EJBObject一个stu
b和skeleton.实际上它并不创建bean本身的stub和skeleton,因为bean不会通过网络被
访问。EJBObject是真正的网络对象。Bean 是包含应用相关的商业编码的代表。
容器也可以调用bean中的某个方法。例如,容器保证当一个bean 实例生成后,home ob
ject中的create()的任何参数会传递bean相应的ejbCreate()方法。 Enterprise bean还
有其它的接口和要求。然而,会话bean和实体bean的要求是不同的。这些在随后详述会
话和实体bean的章节中会cover.
Remote Interface
编写完enterprise bean后开发者创建了一个客户端可访问创建方法的home interface,
在home interface中每一个create()方法在相应的bean中都必须有一个ejbcreate()方法
。同样,开发者必须创建描述客户端能够访问的商业方法的remote interface。
因为所有的客户端调用都通过EJBObject,因此实现这个接口的是EJBObject而不是home 
object. Remote interface中列出的方法名和signature必须和实现bean的方法名和sig
nature相同。这不同于home interface--方法signature是一样的,而名字却不同。以下
是一个remote interface的例子:
public interface Account extends javax.ejb.EJBObject {
public void deposit(double amount)     throws RemoteException;
public void withdraw(double amount)   throws RemoteException;
public double balance()               throws RemoteException;
}
所有声明的方法都必须抛出一个RemoteException例外,因为规范要求客户端stub是RMI
兼容的。但这并不意味着排除了用其它的传输方式的stub/skeleton实现,如CORBA/IIO
P.
Remote interface继承javax.ejb.EJBObject接口,增加了额外的方法要求。
EJBObject
EJBObject是网络上可视的对象,包含stub和skeleton,作为bean的代理。Bean的remote
 interface继承了EJBObject接口,而EJBObject类实现这个remote interface,使得bea
n类有自己的EJBObject类。对每个bean类有一个定制的EJBObject类。
如下是EJBObject接口的定义,被bean的remote interface继承:
public interface javax.ejb.EJBObject extends java.rmi.Remote {
public EJBHome getEJBHome()         throws RemoteException;
public Object   getPrimaryKey()        throws RemoteException;
public Handle   getHandle()            throws RemoteException;
public void     remove()  throws RemoteException,RemoveException;
public boolean isIdentical(EJBObject other)  throws RemoteException;
}
实现这个接口的EJBObject类是一个RMI服务器对象,因为它是他实现了一个RMI remote
 interface.注意bean本身不是一个remote object,在网络上是不可视的。当容器实例
化了这个EJBObject类时,容器会初始化bean实例的引用,使得它能正确地delegate商业
方法调用。
厂商的实现是维护EJBObject实例和bean实例的一对一关系。因为remote interface包含
EJBObject接口的方法,所以bean不必显式地实现这个接口,虽然它提供了列出的商业方
法的实现。因为EJBObject必须正式地实现bean的remote interface,容器在bean安装时
产生EJBObject的源代码,这些产生的源代码实现了bean的remote interface.典型的EJ
BObject有一个独特的类名,作为EJBObject类和bean的联系。

--



  在时间面前,没有永恒
      
         ------一个热爱自由的人

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 211.99.237.22]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.615毫秒