Java bean 包装器(访问 bean)

Java™ bean 包装器访问 bean 允许象使用标准 Java bean 一样来使用会话 bean 或实体 bean。

与所有访问 bean 一样,Java bean 包装器扩展了超类 com.ibm.ivj.ejb.runtime.AbstractAccessBean。

要了解 Java bean 包装器的底层框架,需要熟悉下列各节中描述的框架特征:

这几节中描述的特征不仅包含 Java bean 包装器的基本框架,而且还包含较复杂的复制助手访问 bean 所基于的基本框架。注意:对于 EJB 2.x 模块中仅包含本地客户机视图的 bean,Java bean 包装器不受支持。

Home 接口映射

返回 EJBObject 的单个实例的 home 接口方法映射至 Java bean 构造函数。返回一组企业 bean 实例的 Home 接口方法被映射至返回相应实例的访问 bean 类型的方法。所有方法都调用适当的远程接口方法。

Java bean 包装器包含一个无参数构造函数,它只是一个不带任何自变量的构造函数。当使用无参数构造函数时,Java bean 包装器执行延迟初始化。当实例化访问 bean 时,不会实例化企业 bean。在进行远程方法调用时,如果尚未对它进行实例化的话,访问 bean 将对远程企业 bean 进行实例化。

当“创建访问 Bean”向导提示您将 home 接口中定义的其中一个 create 或 finder 方法映射至访问 bean 的无参数构造函数时,对于被映射至无参数构造函数的 create 或 finder 方法的每个参数,访问 bean 中自然而然将包含一个 init_xx 属性。当在容器管理的持久性(CMP)企业 bean 的 create 或 finder 方法中使用了键类时,键字段将被用作 init_xx 属性而不是键类。通常将键字段声明为简单类型,它使可视构造工具更容易使用访问 bean。当使用无参数构造函数时,在对访问 bean 进行任何其他调用之前必须首先设置 init_xx 属性。访问 bean 可以包含几个多参数构造函数,每个构造函数分别对应于在企业 bean home 接口中定义的其中一个 create 或 finder 方法。

home 接口中返回企业 bean 实例集合的每个 finder 方法被映射至访问 bean 中的 finder 方法。必须首先实例化访问 bean,然后调用适当的 finder 方法,才能返回一组访问 bean。要实例化企业 bean,访问 bean 将调用在企业 bean home 接口中定义的 create 或 finder 方法。如果使用了无参数构造函数,则调用第一个业务方法时访问 bean 仅实例化实际的企业 bean。

访问 bean 运行时包含用于处理 EJBObjects 的枚举的类。对于返回 EJBObjects 的 java.util.Enumeration 的任何主 finder 方法,相应的访问 bean 方法返回专用的 Enumeration 类,其 nextElement() 方法实例化服务器端的企业 bean 并返回使用相应的 EJBObject 引用来实例化的访问 bean。仅当对访问 bean 调用了 nextElement() 而不是 finder 方法时,才实例化企业 bean。而且,不需要手工实例化访问 bean(基于 EJBObject 引用)。支持返回“集合”的 finder,但由于整个“集合”是使用所有已实例化的访问 bean 创建的,因此存在持久性问题。

远程接口映射

远程接口方法映射至 Java bean 方法。企业 bean 远程方法也可以返回 EJBObject。当在访问 bean 类中生成这种方法时,返回类型将更改为相应的访问 bean 类型。这使得您的客户机程序只处理访问 bean 类型并继承访问 bean 所提供的益处。

JNDI 映射

缺省 JNDI 名称生成到每个访问 bean 类中。代码生成器使用在扩展编辑器中指定的 JNDI 名称,缺省情况下,该名称是 home 接口名称。对于 Java bean 包装器(和复制助手),可以使用 setInit_JNDIName() 来更改 JNDI 名称。

通常,不需要更改 JNDI 名称。然而,如果将企业 bean 部署到不同的 home,则管理员可以在 JNDI 名称前面添加前缀来指出差异。要查找 home,访问 bean 获得称为 rootContext 的名称服务上下文,如果知道名称服务 URL 和名称服务类型,就可以构造名称服务上下文。 访问 bean 提供两个 API 来设置 rootContext 的属性:

    setInit_NameServiceTypeName()    setInit_NameServiceURLName() 

然而,如果客户机程序正在 WebSphere® 运行时环境中运行,则不需要这两个 API,因为系统会自动设置 rootContext。

为了设置 Java bean 包装器(和复制助手)的全局 JNDI URL 名称和类型,提供了两对 API。第一对 API 是:

public void setInit_NameServiceTypeName(string_name)
public void setInit_NameServiceURLName(string_name)

这些是实例方法,它们修改所调用的访问 bean 的名称服务属性。仅当使用了访问 bean 的无参数构造函数时才使用这些方法。

第二对 API 是:

public static final setGlobal_NameServiceTypeName(string_name)
public static final setGlobal_NameServiceURLName(string_name)

这些是适用于在客户机程序中使用的 Java bean 包装器(和复制助手)的静态方法。 在实例化新的访问 bean 之前,调用这些方法,以便特定的访问 bean 在实例化服务器端的企业 bean 时使用新的名称服务类型或 URL。

当访问 bean 的多个实例使用同一 home(相同的 JNDI 名称和 rootContext)时,访问 bean 类只查看相应的企业 bean home 一次。 每个访问 bean 类都保留一个类级别的高速缓存,以便在实例化企业 bean 时改进性能。在客户机 VM 的生存期内,访问 bean 运行时保持按 JNDI 名称、名称服务 URL 和名称服务类型来建立索引的所有 home 引用的静态高速缓存。 客户机可以对 resetHomeCache() 发出调用来复位高速缓存,如果特定的 home 引用不再有效,这就很有用。

访问 bean 序列化

当对访问 bean 进行序列化时,不会对某些访问 bean 属性进行序列化,例如,远程接口引用(EJBObject 引用)、home 接口引用和全局 JNDI 信息(名称、名称服务 URL 和名称服务类型)。然而,对于复制助手访问 bean,将对属性的高速缓存进行序列化。

示例

在以下列示例中,显示了用来创建职员的用户程序:

   EmployeeAccessBean aEmployee = new EmployeeAccessBean ()
   aEmployee.setInit_employeeNo ("100");
   aEmployee.setName ("IBM");
   aEmployee.setAddress ("1150 Eglinton Ave, Toronto");


反馈