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

日期: 2009-11-03 作者:IBM developerworks 来源:TechTarget中国 英文

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

  到目前为止,没有什么是听起来不可管理的,但您要认识到有时方法中的不匹配是无意的,这时情况就会有所变化。在部署bean时,您会认识到需要一个新方法,此时,很自然地就会发生这种情况。将方法添加到了bean实现类中,但随后忘记将它添加到远程接口。现在您已经添加了所必需的功能,但还没有办法让远程用户真正访问它。这时就需引入 业务接口(Business Interface)模式。

  业务接口模式

  首先,需要编写一个定义所有业务方法的接口。这非常象远程接口,但不具备 EJB 语义。清单 1 显示了 Library 对象的一个简单的业务接口。

  清单 1. Library 业务接口

1 package com.ibm.library;
2
3 import com.ibm.library.exceptions.NoSuchBookException;
4
5 import java.util.List;
6
7 public interface ILibrary {
8
9      public List getBooks();
10      public List getBooks(String category);
11
12      public Book getBook(String isbn)
13          throws NoSuchBookException;
14
15      public boolean checkout(Book book);
16      public boolean checkout(List books);
17
18      // And so on…
19 }
 
  很明显,该示例很简单,但您可领略其中的思想。这个业务接口明确地定义Library对象的业务用法。为了使接口与EJB规范兼容,您只需做一次特定于EJB的让步:必须确保每个方法都可以抛出java.rmi.RemoteException。清单2显示了完整的业务接口。

  清单 2. 完成Library业务接口

1 package com.ibm.library;
2
3 import com.ibm.library.exceptions.NoSuchBookException;
4
5 import java.rmi.RemoteException;
6 import java.util.List;
7
8 public interface ILibrary {
9
10      public List getBooks()
11          throws RemoteException;
12      public List getBooks(String category)
13          throws RemoteException;
14
15      public Book getBook(String isbn)
16          throws NoSuchBookException,
17                 RemoteException;
18
19      public boolean checkout(Book book)
20          throws RemoteException;
21      public boolean checkout(List books)
22          throws RemoteException;
23
24      // And so on…
25 }

  有了合适的与EJB兼容的业务接口,下一步是在远程接口中扩展它。因为在Library接口中定义了所有的业务方法,所以实际上不必将任何新方法添加到远程接口。清单 3 显示:如果使用业务接口模式构建远程接口,它会是什么样子。

  清单 3. Library远程接口

1 package com.ibm.library;
2
3 import javax.ejb.EJBObject;
4
5 public interface Library extends ILibrary, EJBObject {
6      // All business methods defined in the ILibrary interface
7 }

  就这样。似乎更简单,不是吗?下一步是对本地接口进行编码,这部分留给您,作为一个练习(只需按照示例使用远程接口即可)。至于home接口(以及本地home接口,如果需要的话),则可以按照一般情况对它们进行编码:对它们不做任何更改。

  然而,在实现类中稍微有些不同。通常,会声明该类实现了javax.ejb.SessionBean接口,或对于消息驱动的bean,实现javax.ejb.MessageDrivenBean接口。然而,在业务接口模式下,实现类还将需要实现新的业务接口(在这种情况下,是 ILibrary 接口)。清单 4 显示了Library bean实现类的实现类头:为了简洁起见,我省去了其余的代码。

  清单 4. Library bean实现类

1 package com.ibm.library;
2
3 import java.rmi.RemoteException;
4 import javax.ejb.CreateException;
5 import javax.ejb.EJBHome;
6 import javax.ejb.SessionBean;
7 import javax.naming.Context;
8 import javax.naming.InitialContext;
9
10 import com.ibm.library.exceptions.*;
11
12 public class LibraryBean implements SessionBean, ILibrary {
13
14      // Implementation of EJB-specific methods
15
16      // Implementation of remote interface methods
17
18      // Utility methods, as needed
19 }
  
  这又会导致对正常过程做略微的小更改。差异在于,当编译bean实现类时,现在编译器将“抱怨”您已省的任何方法。通过使用业务接口模式,您已经建立了一个系统,其中,业务接口定义了业务方法,远程接口将它们公开给客户机,并且bean类负责实现它们。同时,您消除了直接实现远程接口的问题,并且不再有在实现类的机器上维护该远程接口的麻烦。您也可以将此模式用于远程和本地接口(两者都继承了业务接口)。而且,消除了对特定供应商所提供的工具的依赖性。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • 何时是创建门户应用最佳时机

    在创建出新企业门户应用,链接到现有系统之前,你可能需要检查一下这些系统,确保这些系统本身不需要重造。这样你可能就会重新考虑是否要创建新企业门户应用了。

  • 采用EJB开发的三个优势

    EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序。当然,还有许多方式可以实现分布式应用,类似微软的.net技术。

  • 构建高性能J2EE应用的十个技巧

    构建高性能的J2EE应用不但需要了解常用的实施技巧。下面介绍最常用的10种有效方法,可帮助架构设计师们快速成为这方面的专家。

  • WPS/WESB绑定:玩转EJB绑定(上)

    面向服务的体系架构(SOA)提出了把功能包装成服务的设计理念。服务组件架构(SCA)是一种实现SOA理念的方式。作为编程模型和框架,SCA定义了描述服务……