EJB 2.x 应用程序到EJB 3.0的移植(上)

来源:互联网 发布:淘宝网上怎么备案啊 编辑:程序博客网 时间:2024/06/06 18:23

原作者: Shashank Tiwari
来源:Javaworld
译者:TKD-恋冰
原文: http://www.javaworld.com/javaworld/jw-08-2006/jw-0814-ejb.html


企业JavaBeans简化了企业bean架构,同时提供了一些更强大的特性。新规范补充支持了Java 5介绍的元数据注释工具以及HibernateTopLink这些工具的持久化和对象关系映射的最佳实践,和在一些轻量级Java框架如Spring中十分流行的依赖注入(Dependency Injection)模式。


本文讨论了把用EJB 2.1或更早版本的规范写的应用程序移植到基于EJB 3.0架构的一些可行的移植策略。我们会从设计和执行两方面来评价这些移植方案。本文并不打算详尽地描述每一种移植策略。阅读完这篇文章后,你应该能够根据自己的实际情况,选择一种最适合自己的方法把旧的EJB编码移植到新的规范。


本文假定你已经熟悉了企业beanJava 5,和对象关系映射的特性及概念。


EJB 2.1EJB 3.0:有哪些变化?


为了能给本文讨论的这些可行的移植方式提供一个上下文联系,我会从讨论新规范中每种不同的bean类型与以前不同的变化开始,然后再简单地贯穿相关的多种bean类型


会话(Session bean


列表1,描述了EJB 2.1规范定义有状态session bean的一个例子。


1.基于EJB 2.1的银行服务的有状态session bean


public interface BankingService extends EJBObject {
        
    
public void deposit(int accountId, float amount) throws RemoteException;
        
    
public void withdraw(int accountId, float amount)throws RemoteException;
        
    
public float getBalance(int accountId) throws RemoteException;

    
public void doServiceLogout() throws RemoteException;

}


public interface BankingServiceHome extends EJBHome {
    
public BankingService create() throws CreateException, RemoteException;
}


public class BankingServiceEJB implements SessionBean {

    
public void deposit(int accountId, float amount) throws RemoteException {
    
//Business logic to deposit the specified amount and update the balance
    }


    
public void withdraw(int accountId, float amount)throws RemoteException {
    
//Business logic to withdraw the desired amount and update the balance
    }


    
public float getBalance(int accountId) throws RemoteException {
    
//Business logic to get the current balance
    }


    
public void doServiceLogout() throws RemoteException {
    
//Service completion and logout logic
    }


    
public void ejbCreate(){}
    
public void ejbActivate(){}
    
public void ejbPassivate(){}
    
public void ejbRemove(){}
    
public void setSessionContext(SessionContext context){}

}
 

EJB 3.0规范中,一个session bean只需要定义一个业务接口和一个bean行为类。Home接口已经被移除了。业务接口就是常规的Java接口,有时也叫作POJI或者纯Java接口(plain-old Java interface)。业务接口不需要扩展EJBObject或EJBLocalObject接口;如果需要,它可以通过描绘业务领域模型的接口层次来定义。

Bean行为类就是常规的Java类,有时也叫作POJO,或者叫纯Java对象(plain-old Java object)。它不用实现EnterpriseBean类型。部署描述符中的声明和配置可以借助元数据注释工具通过Java编码来定义。此外,大多数配置都提供了默认值,因此最大程度的减小了bean详细配置的必要条件。在新规范下,你可以不用任何ejb-jar.xml等部署描述符就能部署session beans,尽管它们依然被保留,并且依然可以被使用,如果开发人员相比注释模型更愿意用它们。

当EJB 3.0 session bean实现了Web service的时,方法作为Web service操作被WebMethod描述符注释。作为Web service终端提供服务的session bean被注释为WebService
2展示了EJB 3.0规范的先前的例子中的有状态session bean

2.基于EJB 3.0的银行服务的有状态session bean
@Remote
public interface BankingService {
    
public void deposit(int accountId, float amount);
    
public void withdraw(int accountId, float amount);
    
public float getBalance(int accountId);
    publlic 
void doServiceLogout();

}



@Stateful
public class BankingServiceBean implements BankingService {

    
public void deposit(int accountId, float amount) {
    
//Business logic to deposit the specified amount and update the balance
    }


    
public void withdraw(int accountId, float amount) {
    
//Business logic to withdraw the desired amount and update the balance
    }


    
public float getBalance(int accountId) {
    
//Business logic to get the current balance
    }


    @Remove
    
public void doServiceLogout () {
    
//Service completion and logout logic
    }


}

 

EJB 2.1和一些更早版本的规范里,对于每一个会话 bean来讲,两个接口——homelocal(或者说是remotebusiness)接口——和bean行为类是必须的。Home接口要求必须扩展EJBHome或者EJBLocalHome接口,而且要声明生命周期方法,比如create()Local,或者说是remote, business接口要求必须扩展EJBObjectEJBLocalObject接口,而且要声名业务方法。Bean行为类本身是EnterpriseBean类型,作为session bean的情况下,扩展了SessionBean子接口。Bean类必须提供其中回调方法的实现,这样容器可以在适当的生命周期事件发生时触发它们。此外,bean中一些受争议的元素, 包括事务和安全定义,还有它们是有状态还是无状态的,都定义在联合部署描述符中。

消息驱动bean

EJB 2.1中,消息驱动bean的类实现了MessageDrivenBean接口和消息监听接口。回调方法在bean类和容器中实现,当特定事件发生时调用相应的方法。Message-driven 消息驱动beans向来都与homeremotelocal接口这些概念无关。
   
EJB 3.0中,MessageDriven注释被用来标记和说明一个消息驱动bean。部署描述符同样可以用来指定一个bean为消息驱动的。因此,bean类不被要求实现MessageDrivenBean接口。消息驱动bean的业务接口就是消息监听接口,它同那些从bean接口处接受到的信息类型吻合。在Java消息服务中,javax.jms.MessageListener是消息监听接口或者业务接口。Bean类需要实现消息监听接口或者用MessageDriven注释去注释它。

新的规范支持回调方法(PostConstruct和PreDestroy),为连接资源提供了依赖注入模式(Dependency Injection),还允许为消息驱动bean定义拦截方法。
原创粉丝点击