当前位置: 首页 > 图灵资讯 > 技术篇> EJB 编程模型

EJB 编程模型

来源:图灵教育
时间:2024-03-03 10:40:44

本文的第二部分解释了创建 Enterprise JavaBean 组件所需的 Java 接口和类的作用。除了对 bean 除了编码类本身,EJB 开发人员也必须这样做 bean 定义本地界面和远程界面。这些接口的实现类通常由容器生成,因此部署 EJB 组件是开发人员和 EJB 容器的合作行为。还区分了第二部分 enterprise bean 两种主要类型,即会话 bean 和实体 bean,并说明了 EJB 容器和 EJB 服务器关系。

enterprise bean 编程模型的三个关键特征是:面向对象、对象的分布式和代理对象的使用。因为使用了这个编程模型 Java 技术,所以本质上是面向对象的。这个模型也是分布式的,指的是 bean 理论上位置是透明的。根据 Enterprise JavaBeans (EJB) 一般来说,规范,EJB 类和 EJB 客户机对容器的实际位置是透明的。想要访问客户机 EJB 使用代理对象进行组件。bean 客户机本身是不可访问的,是的 bean 访问方法的原因 helper 类提供。

接口、委托和代理 当 Java 编写一个程序员 Enterprise JavaBeans 当组件时,他们创建的类必须实现一个 EJB 它必须包含一个名称 ejbCreate() 方法。一个 EJB 接口 -- 例如 SessionBean 接口 -- 它们包括以下几种方法:

ejbActivate() ejbPassivate() ejbRemove() setSessionContext()

ejbActivate() 和 ejbPassivate() 方法通知一个 bean,管理该 bean 在主动和被动之间切换容器组件 bean 状态(这通常是指在内存中或交换到磁盘)。ejbRemove() 方法使 bean 知道它已经从容器中删除了。setSessionContext() 方法使 bean 与上下文对象有关,上下文对象是为了方便 bean 与容器通信。

ejbCreate() 方法不是从零开始创建的 enterprise bean 的。当客户机想要创建新的时候 enterprise bean 时,bean 这个容器将被调用 bean 的类的 newInstance() 实例化新的方法 bean 对象。然后调用容器 setSessionContext() 建立上下文对象的方法 bean 进行通信。最后,新的容器调用 bean 中的 ejbCreate() 方法。像 ejbCreate()、ejbActivate() 和 ejbPassivate() 这种方法有时被称为不同于业务逻辑的对象生存周期方法。

当开发人员设计新的时候 EJB 组件时,编写组件 enterprise bean 类代码本身是不够的。EJB 程序员还必须写两个 helper 类使用的 Java 接口。这些强制接口必须扩展标准 EJBObject 和 EJBHome 接口,而这两个接口都是接口, java.rmi.Remote marker 扩展接口。扩展标准 EJBObject 接口的接口被称为 enterprise bean 指定在远程接口的远程接口 bean 定义自己的业务方法。调用应用程序 enterprise bean 在业务方法中,不访问应用程序 bean 本身。实际上,方法调用已经传递给实现 EJBObject 扩展接口的对象。这种做法叫委托,就是委托。 EJB 系统结构中的一个设计要点:

“客户机从不直接访问 enterprise bean 类的实例。总是使用客户机 enterprise bean 访问远程接口 enterprise bean 的实例。实现 enterprise bean 容器提供的远程接口类别。这种实现的分布式对象称为 EJB 对象。”(Enterprise JavaBeans Specification 1.0)

bean 对 EJBObject 接口的扩展称为远程接口,实现远程接口的对象称为 EJB 对象。

enterprise bean 还必须有本地接口。这个接口是标准 EJBHome 扩展接口。实现 bean 本地接口的对象称为本地对象。本地对象包含一个 create() 该方法由应用程序调用,而应用程序必须创建一个 bean 实例。本地对象中的 create() 创造新的方法 EJB 对象。它并没有直接创造新的 enterprise bean 例子,因为不允许直接访问 bean。

EJB 充当对象和本地对象 bean 对象的代理,因为它们代表 bean 调用接收方法。EJB 对象主要为 bean 作为代理的业务方法;本地对象主要是 bean 作为代理的生存周期方法。

为 EJB 组件使用 create() 方法不一定要实例化新。 bean。对于某些类型的集装箱,如何最好地满足创建要求? bean,它可以重用现有的例子:

“客户机使用会话 bean 本地界面 create 和 remove 方法。虽然客户机认为它在控制 EJB 例子的生存周期,但容器正在处理中 create 和 remove 调用不需要创建和删除 EJB 实例。在客户机和...实例之间没有固定的映射。容器只是将客户机的工作委托给任何方法已经准备就绪的可用实例。”(Enterprise JavaBeans Specification 1.0)

创建新的 bean 实例受容器控制,可与客户机发布 create() 方法异步。

当创建一个 EJB 组件定义时,开发人员负责定义 EJBObject 接口和 EJBHome 接口,但不需要编写实现这些接口类别的代码。EJB 容器软件组件自动创建这些类别。

下面的代码段解释了如何使用客户机应用程序 CartBean 的 enterprise bean 在线购物:

CartHome cartHome = javax.rmi.PortableRemoteObject.narrow(initialContext.lookup("applications/shopping_cart"), CartHome.class);Cart cart = cartHome.create();cart.addItem(item29);cart.addItem(item67);cart.addItem(item91);cart.purchase();cart.remove();

CartHome 是实现本地接口的类别(EJBHome 扩展接口)。Cart 是实现远程接口的类别(EJBObject 扩展接口)。当客户机调用应用程序方法(如 addItem() 和 purchase(),它们在那里 cart 调用对象,然后委托这些方法的执行 bean 自身。enterprise bean 其功能是通过其代理 EJB 对象(即 cart)来获得的。如果同时访问多个客户机,如果同时访问 cart bean,会发生什么?Enterprise bean 开发人员不需要编写代码来支持并发访问。并发性由 EJB 容器支持。

下图说明各 EJB 对象之间的关系:

服务器和容器 EJB 系统结构包括 EJB 服务器和 EJB 容器的两个概念。EJB 作为一个组件执行系统,服务器就像 EJB 在白皮书中描述:

“Enterprise JavaBeans 每个支持完全可移植性的规范 Java 应用程序服务器定义了一个标准模型。任何制造商都可以使用这个模型来实现 Enterprise JavaBeans 支持组件。多种系统(如 TP 监视器、CORBA 运行时的系统,COM 运行时的系统,数据库系统、Web 服务器系统或其他基于服务器的运行系统)可以调整到支持可移植的系统。 Enterprise JavaBeans 组件。”(Thomas, Enterprise JavaBeans Technology: Server Component Model for the Java Platform)

EJB 使用服务器 EJB 组件应用程序提供操作环境,并提供所有必要的服务来支持 EJB 体系结构。打包 EJB 服务器软件没有提前规定的方式。一种方法是将其作为功能增强包括在应用程序服务器中 IBM WebSphere Application Server, Advanced Edition, Version 2.0 中间使用的方法。

EJB 组件并不在 EJB 直接执行服务器顶部。一个叫做 EJB 容器的中间软件组件 EJB 这些都是在服务器环境中运行的 bean 提供自己的操作环境。EJB 容器对 EJB 应用程序是完全透明的,但支持它 bean 操作起着关键作用。

为了使 enterprise bean 它们可以作为可重用的软件组件,不能与特定服务器或平台功能的内部建设相关。服务器端功能的几种常见类型已经从 bean 该功能的责任在设计中“分离”,并转移到容器组件中。例如,容器将被用来接管安全性、并发性、事务处理、交换到辅助存储器和其他服务 bean 不受服务器相关性的限制,优化业务逻辑,而不是服务逻辑。

EJB 白皮书这样描述容器的功能:

“EJB 其中部署了容器管理 enterprise bean。客户机应用程序不直接与 enterprise bean 进行交互。相反,客户机应用程序通过容器生成的两个封装接口( EJB Home 接口和 EJB Object 接口)与 enterprise bean 进行交互。当客户机使用封装接口调用各种操作时,容器拦截各种方法并插入管理服务。”(Thomas, Enterprise JavaBeans Technology: Server Component Model for the Java Platform)

可以期望 EJB 容器软件通常会跟着 EJB 尽管规范允许分离这些组件,但服务器软件是一起提供的。除了提供运营服务(如事务处理和安全)的访问外,我们还期待 EJB 容器包括各种必要的工具来支持 enterprise bean 安装、操作和管理。例如,需要工具来解释 EJB jar 有工具生成数据库访问文件的内容,以获得容器提供的耐久性,并监控正在运行的工具 bean 行为,实现安全等。

Bean 风格 EJB 组件分为两类 -- 会话 bean 和实体 bean。根据 bean 这些类别的处理状态、事务和持久性也可以进一步细分。会话 bean 通常具有以下属性:

代表单个客户机执行行 可以是事务性 共享数据库中的数据可以更新 生存期相对较短 其生存期通常是客户机的生存期 任何持久性数据都是由 bean 管理 可以根据容器的判断删除 会在 EJB 在服务器失败时被删除 实体 bean 通常具有以下属性:

代表数据库中的数据 是事务性的 允许多个用户一起访问 可长期存在 容器可以管理持久性数据 在 EJB 服务器失败后,EJBB可以继续生存 规范对会话 bean 和实体 bean 说明如下:

“对客户机,会话 enterprise bean 它是一个非持久的对象,它实现了一些在服务器上运行的业务逻辑。想象会话对象的一种方式是:会话对象是运行在服务器上的客户机程序的逻辑扩展。会话对象不在多台客户机器之间共享。

“对于客户机,实体 enterprise bean 它是一个持久的对象,它代表了存储在持久存储器(例如,数据库)中的对象视图,或由现有企业应用程序实现的实体。”(Enterprise JavaBeans Specification 1.0)

用粗略的说法说话 bean 它代表检索或存储数据以满足用户要求的操作;实体 bean 它代表一个数据集,可以访问这些数据集来满足用户的要求。

会话 bean 最简单的一个 Enterprise JavaBeans 组件是无状态会话 bean。因为这些 bean 它们的状态没有区别,所有的例子都是一样的。无状态会话的容器管理 bean 生存周期的方式是通过创建足够数量的生存周期 bean 适应客户机的工作负荷,并在不需要时删除。钝化,即将闲置 bean 写在磁盘上,不用于无状态会话。要调用 bean,本地接口中的客户机程序调用客户机程序 standard create() 方法,虽然这个操作不一定会导致新的实例化 bean 实例。容器可选择将客户机请求发送给现有对象。相反,容器可以根据其选择创建新的例子,并由客户机独立发布 create() 方法。

在 EJB 发布在本地对象上 create() 调用返回一对 EJB 对象的引用,这个 EJB 对象代表 enterprise bean。一旦有了客户机 EJB 引用对象,可以将业务方法发布到 EJB 在对象上,容器将委托这些方法 bean 自身。负责管理会话 bean 不需要推断会话的容器组件 bean 是否处于无状态。会话 bean 在安装过程中声明是无状态还是有状态。

如果会话 bean 在方法调用之间保留状态信息是有状态的。通过调用 ejbPassivate() 方法,容器可以根据其判断进行状态对话 bean 钝化,或写在辅助存储器中。EJB 规范不要求容器钝化 bean 时使用 Java 串行协议,但必须提供等价功能。当容器决定进行非活动会话时 bean 当交换回到内存时,它会取消被动 bean 并调用串行化 ejbActivate() 方法。有状态会话 bean 开发人员负责确保状态数据可以串行。在集群应用程序服务器环境中实现状态对话 bean 一定要小心,因为并不是所有的服务器都支持集群的状态对话 bean 的同步化。

有状态会话 bean 可以是事务性。通过使用 javax.transaction.UserTransaction 接口中的方法,如 begin()、commit() 和 rollback(),bean 可以控制事务;通过实现 javax.ejb.SessionSynchronization 接口,bean 您可以收到有关事务状态的通知。EJB 容器不需要推断什么 bean 需要事务支持;UserTransaction 安装时只能用于标记为事务性的接口 bean。

实体 bean 实体 bean 在系统结构上与会话 bean 类似地,但它们提供访问企业数据,而不是支持用户对话。一个实体 bean 它可以支持多个并发用户,而容器可以同步访问和事务。实体 bean 它还支持当地对象 finder 方法的主键。知道实体 bean 主键客户机可以在本地对象上调用 findBy PrimaryKey() 获得对象引用的方法。与会话 bean 不同,实体 bean 除了当地对象 create 除了方法之外,还有 finder 方法。

持久性是实体 bean 一个基本属性。EJB 规范允许两种形式的实体持久性:bean 管理和容器管理的持久性。代表关系数据库中数据的实体 bean,bean 持久性管理意味着数据库访问的调用直接写在企业中 bean (使用)的方法 JDBC 或 SQLJ)。这种方法是直接的,但它降低了可移植性。容器对持久性的管理意味着 bean 不受数据库调用的影响。安装时通知容器相关信息 bean 容器负责生成数据所需的持久性代码。允许使用这种方法 bean 可移植性更高,甚至可以持续使用不同的数据源。但是,这种方法要求容器具有复杂的功能。

当实体 bean 对象与 EJB 当对象相关时,前者处于就绪状态;否则,它们将被视为共享状态。当客户机调用时 EJB 对象中的方法,容器找到相关的实体 bean 例子(如果存在的话),或者从共享状态中传输一个例子。处于就绪状态的实体 bean 通过委托从客户机上传播给他们的业务方法可以接收到调用。它们也可以在容器请求时执行 ejbLoad() 和 ejbStore() 方法。load 方法和 store 该方法旨在维持实体 bean 数据与基本数据存储之间的一致性。

实体 bean 并发访问多个用户的数据。EJB 保持数据完整性是容器的责任:

“enterprise bean 在编写业务方法时,开发人员不必担心多个事务的并发访问。enterprise bean 开发人员在编写方法时可以假设,对于同时访问多个事务的实体 bean,能够保证适当的同步化。”(Enterprise JavaBeans Specification 1.0)

容器通常通过锁定数据库中的数据或创建实体来完成这个任务 bean 并允许在基本数据存储中使用并发控制的多个例子来管理访问。

上一篇:

Taglib指令

下一篇:

时代潮流——Java