服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 核心技术 > 查看文档

前进:从ejb 2.1到ejb 3.0

  在开始讨论怎样从ejb 2.1迁移到ejb 3.0之前,有必要先了解一下迁移之后将会得到什么:主要来说,ejb 3.0减少了在创建ejb时所需的类、接口、部署描述符的数量。ejb 3.0通过用纯旧式java对象(pojo)取代抽象bean类,用纯旧式java接口(poji)取代组件与主接口(component & home),简化了ejb的开发过程,在此,后者是可选项--你不必全部包含进它们。

      在开始讨论怎样从ejb 2.1迁移到ejb 3.0之前,有必要先了解一下迁移之后将会得到什么:主要来说,ejb 3.0减少了在创建ejb时所需的类、接口、部署描述符的数量。ejb 3.0通过用纯旧式java对象(pojo)取代抽象bean类,用纯旧式java接口(poji)取代组件与主接口(component & home),简化了ejb的开发过程,在此,后者是可选项--你不必全部包含进它们。

  部署描述符--ejb-jar.xml--由其指定了ejb名、bean对象名、接口、查找者方法、容器管理关系(cmr),在此就不再需要其他与开发商相关的部署描述符了,因为已被组件类中的元数据注释所取代。这就是你为什么需要使用jdk 5.0来开发ejb 3.0应用的原因,因为它们使用了注释,而注释在jdk 5.0之前不可用。

  ejb 3.0用javax.persistence.entitymanager api取代了ejb 2.1中的查找者方法,通常ejb 2.1的客户端应用使用jndi名来获得一个对实体(entity)及会话(session)bean对象的引用,而ejb 3.0客户端应用则是使用@resource、@inject和@ejb。

  在ejb 2.1中,可使用javax.ejb包装类与接口来开发实体与会话,在此,一个会话bean实现了sessionbean接口,而一个实体bean实现了entitybean接口;相比之下,ejb 3.0的会话与实体bean类是pojo,并没有实现sessionbean和entitybean接口。

  一个ejb 2.1的会话bean类指定了一个或多个ejbcreate方法、回调方法、setsessioncontext方法和业务(business)方法;与此类似,一个ejb 2.1实体指定了ejbcreate()、ejbpostcreate()、回调、容量管理持久性(cmp)、cmr的getter/setter和业务方法。一个ejb 3.0会话bean类只指定了业务方法;同样地,一个ejb 3.0实体bean只指定了业务方法、对不同bean属性的getter/setter方法及对bean关系的getter/setter方法。

  ejb 2.1主接口扩展了javax.ejb.ejbhome接口、另有一个本地主接口扩展了javax.ejb.ejblocalhome接口;ejb 2.1的远程接口扩展了javax.ejb.ejbobject接口,另有一个本地接口扩展了javax.ejb.ejblocalobject接口。在ejb 3.0中,并没有指定组件与主接口--它们已被poji取代,如果一个会话bean类没有指定一个业务接口,那么ejb服务器将从会话bean类中为它生成一个poji业务接口。

  请在脑海中记住这些变化,本文的后续部分,将用两个示例来集中讲述把一个会话bean和一个实体bean,从ejb 2.1迁移到ejb 3.0时所需的详细信息。

  迁移会话bean

  示例中的ejb 2.1会话bean类--bookcatalogbean--指定了一个ejbcreate方法、一个称为gettitle()的业务方法和一个回调方法:

// bookcatalogbean.java
import javax.ejb.sessionbean;
import javax.ejb.sessioncontext;
public class bookcatalogbean implements sessionbean 
{
 private sessioncontext ctx;
 public string getedition(string title)
 {
  if(title.equals("java & xml"))
   return new string("第二个版本");
  if(title.equals("java and xslt"))
   return new string("第一个版本");
 }
 public void ejbcreate(){}
 public void ejbremove() {}
 public void ejbactivate() {}
 public void ejbpassivate() {}
 public void setsessioncontext(sessioncontext ctx) 
 {this.ctx=ctx;}

  在ejb 3.0会话bean中,可使用元数据注释来指定bean类型,即使用@stateful和@stateless来分别指定stateful(有状态)或stateless(无状态)。也可在一个会话bean中用一个业务接口来取代组件与主接口,因为业务接口是一个poji,所以可用@local和@remote来指定其为本地或远程类型,而一个会话bean可同时实现本地与远程接口。

  如果在bean类不指定接口类型(本地或远程),那ejb服务器在默认情况下会自动生成一个本地业务接口,在此也可使用@local和@remote注释来指定接口类。

  下面的ejb 3.0会话bean是一个pojo,其由前面的bookcatalogbean.java ejb 2.1无状态会话bean移植而来,注意它使用了@stateless注释,实现了一个本地业务接口,并在@local注释中指定了本地接口类名。

// bookcatalogbean.java ejb 3.0 session bean
@stateless
@local ({bookcataloglocal.java})
public class bookcatalogbean implements 
bookcataloglocal
{
 public string getedition(string title)
 {
  if(title.equals("java & xml")
   return new string("第二个版本");
  if(title.equals("java and xslt"))
   return new string("第一个版本");
 }
}
 
  另外,也要注意,通过@local注释,上面的ejb 3.0bean类用一个本地业务接口(poji)取代了ejb 2.1中的组件与主接口。

扫描关注微信公众号