前进:从EJB 2.1到EJB 3.0
2008-02-23 08:11:08来源:互联网 阅读 ()
部署描述符--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中的组件与主接口。
迁移EJB会话bean客户端
一个EJB 2.1会话bean的客户端通过使用JNDI名可取得一个会话bean对象,如下所示的客户端使用了BookCatalogLocalHome的JNDI名取得一个本地主对象,接着调用了create()方法,随后,客户端用getEdition(String)业务方法输出特定标题的版本值。
import javax.naming.InitialContext;
public class BookCatalogClient
{
public static void main(String[] argv)
{
try{
InitialContext ctx=new InitialContext();
Object objref=ctx.lookup("BookCatalogLocalHome");
BookCatalogLocalHome catalogLocalHome = (BookCatalogLocalHome)objref;
BookCatalogLocal catalogLocal = (BookCatalogLocal) catalogLocalHome.
create();
String title="Java and XML";
String edition = catalogLocal.getEdition(title);
System.out.println("标题的版本:" title " " edition);
}
catch(Exception e){}
}
}
在EJB 3.0中,可通过依赖性注入,来获取一个对会话bean对象的引用,这通常由@Inject、@Resource、@EJB注释来实现。如下所示的EJB 3.0会话bean客户端使用了@Inject注释注入到BookCatalogBean类中,仍可由getEdition(String)业务方法来获取标题的版本值。
public class BookCatalogClient
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash