top
Loading...
EnterpriseJavaBeans導論二
b>理解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 JavaBeanEnterprise 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不會通過網絡被訪問。EJBObject是真正的網絡對象。Bean 是包含應用相關的商業編碼的代表。容器也可以調用bean中的某個方法。例如,容器保證當一個bean 實例生成后,homeobject中的create()的任何參數會傳遞bean相應的ejbCreate()方法。 Enterprisebean還有其它的接口和要求。然而,會話bean和實體bean的要求是不同的。這些在隨后詳述會話和實體bean的章節中會cover.Remote Interface編寫完enterprise bean后開發者創建了一個客戶端可訪問創建方法的home interface,在home interface中每一個create()方法在相應的bean中都必須有一個ejbcreate()方法。同樣,開發者必須創建描述客戶端能夠訪問的商業方法的remoteinterface。因為所有的客戶端調用都通過EJBObject,因此實現這個接口的是EJBObject而不是homeobject. Remote interface中列出的方法名和signature必須和實現bean的方法名和signature相同。這不同于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/IIOP.Remote interface繼承javax.ejb.EJBObject接口,增加了額外的方法要求。EJBObjectEJBObject是網絡上可視的對象,包含stub和skeleton,作為bean的代理。Bean的remoteinterface繼承了EJBObject接口,而EJBObject類實現這個remote interface,使得bean類有自己的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.典型 的EJBObject有一個獨特的類名,作為EJBObject類和bean的聯系。
轉自 www.chinacode.net 中國代碼聯盟新聞組

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com