分享
 
 
 

EJB 最佳实践:改进远程对象设计

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

业务接口模式如何帮助避免不匹配的方法

级别:中级

Brett McLaughlin(brett@oreilly.com)

作家兼编辑,O'Reilly & Associates

2002 年 11 月

在这一新系列文章中,您将学习如何最佳设计和优化 Enterprise JavaBeans 组件、如何减少 RMI 通信和 JNDI 访问以及最有效地使用企业应用程序。在每篇技巧文章中,企业 Java 编程方面的主要权威人士 Brett McLaughlin 将提供最佳实践或设计模式。许多技巧文章将建立在前面的文章之上。建议您按顺序阅读这些技巧文章,因为它们将帮助您构建有助于您自己的企业应用程序编程的策略和设计方法。在本篇(也是第一篇)技巧文章中,Brett 演示了业务接口模式如何能够改进远程对象设计。

如果您开发过许多 EJB 组件,那么您很清楚远程对象设计的难点。分布 EJB 组件的核心是能够将 bean 的实现(由 Bean 类表示)与其接口(由远程或本地接口表示)分开。接口是公开给客户机的,并且通常用在与实际的实现类不同的 JVM 中。这意味着在代码这一级它们彼此之间很少有依赖关系;又意味着,接口中可能有一些不在实现中的方法,反之亦然。例如,实现类的实用程序方法不必放在远程接口上。

警告:不要将这种模式与实体 bean 一起使用!

业务接口模式仅适用于会话 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 组件中使用值对象来改进应用程序性能。到那时,我们网上再见。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有