EJB 最佳实践: 改进远程对象设计
来源:互联网 发布:ae视频制作软件 编辑:程序博客网 时间:2024/05/17 02:16
如果您开发过许多 EJB 组件,那么您很清楚远程对象设计的难点。分布 EJB 组件的核心是能够将 bean 的实现(由 Bean
类表示)与其接口(由远程或本地接口表示)分开。接口是公开给客户机的,并且通常用在与实际的实现类不同的 JVM 中。这意味着在代码这一级它们彼此之间很少有依赖关系;又意味着,接口中可能有一些不在实现中的方法,反之亦然。例如,实现类的实用程序方法不必放在远程接口上。
业务接口模式仅适用于 会话 bean和 消息驱动的 bean;该模式不适用于实体 bean,它永远都不应该直接公开给应用层。事实上,业务接口模式在 EJB 2.0 实体 bean 中会停止工作,因为这些类被声明为 abstract
,所以不能被选中。
到目前为止,没有什么是听起来不可管理的,但您要认识到有时方法中的不匹配是 无意的,这时情况就会有所变化。在部署 bean 时,您会认识到需要一个新方法,此时,很自然地就会发生这种情况。将方法添加到了 bean 实现类中,但随后忘记将它添加到远程接口。现在您已经添加了所必需的功能,但还没有办法让远程用户真正访问它。这时就需引入 业务接口(Business Interface)模式。
注:业务接口模式不是避免远程对象设计中不匹配的方法的唯一方法。请阅读补充文章“ 业务接口模式的替代方法”以学习其它解决方案。
业务接口模式
首先,需要编写一个定义所有业务方法的接口。这非常象远程接口,但不具备 EJB 语义。清单 1 显示了 Library
对象的一个简单的业务接口。
清单 1. Library 业务接口
package com.ibm.library;import com.ibm.library.exceptions.NoSuchBookException;import java.util.List;public interface ILibrary { public List getBooks(); public List getBooks(String category); public Book getBook(String isbn) throws NoSuchBookException; public boolean checkout(Book book); public boolean checkout(List books); // And so on...}
很明显,该示例很简单,但您可领略其中的思想。这个业务接口明确地定义 Library
对象的业务用法。为了使接口与 EJB 规范兼容,您只需做一次特定于 EJB 的让步:必须确保每个方法都可以抛出 java.rmi.RemoteException
。清单 2 显示了完整的业务接口。
清单 2. 完成 Library 业务接口
package com.ibm.library;import com.ibm.library.exceptions.NoSuchBookException;import java.rmi.RemoteException;import java.util.List;public interface ILibrary { public List getBooks() throws RemoteException; public List getBooks(String category) throws RemoteException; public Book getBook(String isbn) throws NoSuchBookException, RemoteException; public boolean checkout(Book book) throws RemoteException; public boolean checkout(List books) throws RemoteException; // And so on...}
有了合适的与 EJB 兼容的业务接口,下一步是在远程接口中扩展它。因为在 Library
接口中定义了所有的业务方法,所以实际上不必将任何新方法添加到远程接口。清单 3 显示:如果使用业务接口模式构建远程接口,它会是什么样子。
清单 3. Library 远程接口
package com.ibm.library;import javax.ejb.EJBObject;public interface Library extends ILibrary, EJBObject { // All business methods defined in the ILibrary interface}
就这样。似乎更简单,不是吗?下一步是对本地接口进行编码,这部分留给您,作为一个练习(只需按照示例使用远程接口即可)。至于 home 接口(以及本地 home 接口,如果需要的话),则可以按照一般情况对它们进行编码;对它们不做任何更改。
然而,在实现类中稍微有些不同。通常,会声明该类实现了 javax.ejb.SessionBean
接口,或对于消息驱动的 bean,实现 javax.ejb.MessageDrivenBean
接口。然而,在业务接口模式下,实现类还将需要实现新的业务接口(在这种情况下,是 ILibrary
接口)。清单 4 显示了 Library
bean 实现类的实现类头;为了简洁起见,我省去了其余的代码。
清单 4. Library bean 实现类
package com.ibm.library;import java.rmi.RemoteException;import javax.ejb.CreateException;import javax.ejb.EJBHome;import javax.ejb.SessionBean;import javax.naming.Context;import javax.naming.InitialContext;import com.ibm.library.exceptions.*;public class LibraryBean implements SessionBean, ILibrary { // Implementation of EJB-specific methods // Implementation of remote interface methods // Utility methods, as needed}
这又会导致对正常过程做略微的小更改。差异在于,当编译 bean 实现类时,现在编译器将“抱怨”您已省的任何方法。通过使用业务接口模式,您已经建立了一个系统,其中,业务接口定义了业务方法,远程接口将它们公开给客户机,并且 bean 类负责实现它们。同时,您消除了直接实现远程接口的问题,并且不再有在实现类的机器上维护该远程接口的麻烦。您也可以将此模式用于远程和本地接口(两者都继承了业务接口)。而且,消除了对特定供应商所提供的工具的依赖性。
业务接口模式有希望能改变您对会话和消息驱动的 bean 进行思考和编码的方式。在下一篇技巧文章中,我将继续研究 EJB 设计模式,并向您演示如何在 EJB 组件中使用值对象来改进应用程序性能。到那时,我们网上再见。
- EJB 最佳实践:改进远程对象设计
- EJB 最佳实践: 改进远程对象设计
- 【笔记】EJb最佳实践
- EJB 最佳实践:动态委派
- EJB 最佳实践: 动态委派
- Java面向对象设计最佳实践 - 枚举设计
- EJB 最佳实践: 用值对象加速您的 RMI 事务
- EJB 最佳实践:验证助手类
- EJB 最佳实践: 实体 bean 保护
- EJB 最佳实践: 业务委派模式
- 数据库设计最佳实践
- 数据库设计最佳实践
- SSAS 设计最佳实践
- 设计模式最佳实践
- 设计异常的最佳实践
- Android UI 设计最佳实践
- Android UI 设计最佳实践
- 数据库设计的最佳实践
- 在C#中链接有密码的ACCESS数据库
- 王佳芝的孤立感与李安的女性悲剧
- 乱码问题深入研究
- WINCE 学习笔记- 关于更改显示屏
- 一个结构继承类的例子
- EJB 最佳实践: 改进远程对象设计
- js 时间比较函数
- java与.net的世纪之争
- C++类模板:模板内的typename名字将屏蔽模板外部的名字
- 各位高手,快帮帮小弟,能否在dos里面实现 date为yyyymmdd的格式?谢谢
- SQL Server数据库开发的二十一条军规
- 网络未来的趋势
- 刷机-3.71M33升级到3.71M33-3的方法
- VC项目文件说明: