赛迪网 > IT技术 Java > (最新更新)Java基础
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

Java基础-EJB 3.0的三大类型详解

发布时间:2006.05.11 08:02     来源:计算机世界报    作者:沈建苗

Enterprise JavaBean (EJB) 是可重用的、可移植的 J2EE 组件。EJB 由封装业务逻辑的方法组成。譬如说,EJB 可能有这样的业务逻辑:包含了更新数据库中客户数据的方法。众多远程和本地客户端可以调用该方法。另外,EJB 在容器里面运行,这样开发人员只要关注bean里面的业务逻辑,不必担心复杂、容易出错的问题,譬如事务支持、安全性和远程对象访问等。EJB 作为普通Java对象(POJO)的形式来开发,开发人员可以使用元数据注释(metadata annotations)来指定容器如何管理这些bean。

EJB 包括三种主要类型:会话 bean、实体 bean和消息驱动的bean。会话bean执行独立的、解除耦合的任务,譬如检查客户的信用记录。实体bean是一个复杂的业务实体,它代表数据库中存在的业务对象。消息驱动的bean用于接收异步JMS 消息。下面,让我们进一步研究EJB 3.0规范中的这些类型。

一、会话bean

会话bean通常代表业务流程里面的操作,譬如“处理订单”。可根据对话状态的保持性,即有状态和无状态对会话bean进行分类。

无状态的会话 bean没有内部状态。它们不跟踪记录从一个方法调用传递到另一个方法调用的信息。因此,每次调用无状态的业务方法都独立于前一次调用,譬如计算税款或者运费。用某个应税值调用计算税款的方法时,对税款值进行计算并返回给调用方法,而不必保存调用者的内部状态供以后调用。因为这些bean并不保持状态,所以容器对它们进行管理就很简单。客户端请求无状态的bean实例时,可以从容器保持的无状态的会话bean 实例池当中接收一个实例。另外,因为无状态的会话 bean可以共享,所以容器可保持数量较少的实例为许多客户端提供服务。想指定Java Bean作为无状态的会话bean加以部署及管理,只需要为该bean添加注释@Stateless。

有状态的会话 bean在方法调用时可保持对话状态,譬如客户的网上购物车。客户开始网上购物时,可以从数据库中检索客户的详细信息。客户往购物车里面添加商品或者从里面删除商品、下订单等时调用的其他方法也可以使用这些详细信息。不过,有状态的会话bean是暂时性的,因为出现会话终止、系统崩溃或者网络故障后,状态不复存在。客户端请求有状态的会话bean实例时,就为该客户端分配一个有状态的实例,并为该客户端保持该组件的状态。要指定容器在某个方法完成后删除有状态的会话bean实例,只要为该方法添加注释@Remove。

会话 bean示例如下:

import javax.ejb.Stateless.*;

/*A simple stateless session bean implementing
the incrementValue() method of the * CalculateEJB interface.*/

@Stateless(name="CalculateEJB")

public class CalculateEJBBean

implements CalculateEJB

{

int value = 0;

public String incrementValue()

{

value++;

return "value incremented by 1";

}

}

二、实体bean

实体bean是管理持久性数据的一个对象,有可能使用几个相关的Java对象,并可以通过主键实现惟一性。通过添加@Entity注释,可以把某类指定为实体bean。实体bean代表数据库中的持久性数据,如客户表中的一行或者员工表中的一条员工记录。实体bean还可以在多个客户端之间共享。譬如说,某个员工实体bean可以由多个客户端用于计算某员工的年薪或者更新员工地址。实体bean对象的特定字段可以成为持久性字段。实体bean中没有被@Transient注释标记的所有字段都被视为持久性字段。EJB 3.0的一个主要特性就是,能够使用元数据注释来创建包含对象/关系映射的实体bean。譬如说,想指定把实体bean的empId字段映射到 Employees表中的EMPNO属性,就要使用@Table(name="Employees") 来注释表名,使用 @Column(name="EMPNO") 来注释字段,如下面的例子所示。另外,EJB 3.0 的一个特性是,在开发期间可以方便地测试实体bean,因为现在使用 Oracle 应用服务器实体测试工具,就可以在容器外面运行实体bean。

实体 bean示例如下:

import javax.persistence.*;

import java.util.ArrayList;

import java.util.Collection;

@Entity

@Table(name = "EMPLOYEES")

public class Employee implements java.io.Serializable

{

 private int empId;

 private String eName;

 private double sal;

 @Id

 @Column(name="EMPNO", primaryKey=true)

 public int getEmpId()

{ return empId;}

 public void setEmpId(int empId)

{ this.empId = empId; }

 public String getEname()

{ return eName; }

 public void setEname(String eName)

{ this.eName = eName; }

 public double getSal()

{ return sal; }

 public void setSal(double sal)

{ this.sal = sal; }

 public String toString()

{StringBuffer buf = new StringBuffer();

buf.append("Class:")

.append(this.getClass().getName()).append(" ::")
.append(" empId:")
.append(getEmpId())
.append(" ename:")
.append(getEname())
.append("sal:")
.append(getSal());

return buf.toString();}

}

三、消息驱动的bean

消息驱动的bean(MDB)为实现异步通信提供了一种比使用直接的Java消息服务(JMS)更简单的方法。MDB用于接收异步JMS消息。容器处理JMS队列和主题所需的大部分设置进程。它把所有消息发送给相关的MDB。MDB允许J2EE应用程序发送异步消息,随后这些消息由应用程序来处理。要把bean指定为MDB,需要实现javax.jms.MessageListener接口,并且用@MessageDriven注释该bean。

消息驱动的bean示例如下:

import javax.ejb.MessageDriven;

import javax.ejb.ActivationConfigProperty;

import javax.ejb.Inject;

import javax.jms.*;

import java.util.*;

import javax.ejb.TimedObject;

import javax.ejb.Timer;

import javax.ejb.TimerService;

@MessageDriven(

activationConfig = {

@ActivationConfigProperty(propertyName="connectionFactoryJndiName",

 propertyValue="jms/TopicConnectionFactory"),

@ActivationConfigProperty(propertyName=
"destinationName", propertyValue="jms/myTopic"),

@ActivationConfigProperty(propertyName=
"destinationType", propertyValue="javax.jms.Topic"),

@ActivationConfigProperty(propertyName=
"messageSelector", propertyValue="RECIPIENT = 'MDB'")
}
)

/** A simple Message-Driven Bean that listens to
the configured JMS Queue or Topic and gets notified via
an * invocation of it's onMessage() method
when a message has been posted to the Queue
or Topic.The bean prints the contents of the message. */

public class MessageLogger implements MessageListener, TimedObject

{

 @Inject javax.ejb.MessageDrivenContext mc;

 public void onMessage(Message message)

 { System.out.println("onMessage() - " + message);

 try

 {

 String subject = message.getStringProperty("subject");

 String inmessage = message.getStringProperty("message");


System.out.println("Message received\n\tDate:" + new java.util.Date()
+ "\n\tSubject:" + subject + "\n\tMessage:" + inmessage + "\n");

 System.out.println("Creating Timer a single event timer");

 TimerService ts = mc.getTimerService();

 Timer timer = ts.createTimer(30000, subject);

 System.out.println("Timer created by MDB at:"
+ new Date(System.currentTimeMillis()) +" with info:"+subject);

  }catch (Throwable ex)

 { ex.printStackTrace(); }

}

 public void ejbTimeout(Timer timer)

 { System.out.println("EJB 3.0:Timer with MDB");

 System.out.println("ejbTimeout() called at:"
+ new Date(System.currentTimeMillis()));

 return; }

}

四、使用 EJB 3.0

EJB客户端是访问bean的应用程序。它不必位于客户端层上,但可以是独立的应用程序、Java服务器页面(JSP)、服务器小程序或者另一个EJB。客户端通过bean的远程或本地接口来使用EJB的方法,远程还是本地取决于客户端是在同一个JVM里面还是不同的JVM里面。这些接口定义了bean的方法,而bean类负责实际实现这些方法。客户端访问bean类的方法时,容器就会为bean生成一个代理,名为远程或者本地对象。远程或者本地对象接收请求后,交给相应的bean实例,并将结果返回给客户端。想调用bean的方法,客户端需要通过使用EJB部署描述符(deployment descriptor)里面定义的bean名称来找到该bean。在以下的示例中,客户端使用Context对象找到名为“Statelessejb”的bean。

EJB 客户端示例如下:

import javax.naming.Context;

import javax.naming.InitialContext;

/* A simple bean client which
calls methods on a stateless session bean.*/

public class CalculateejbClient

{

public static void main(String [] args)

{

 Context context = new InitialContext();

 CalculateEJB myejb =(CalculateEJB)context.lookup
("java:comp/env/ejb/CalculateEJB");

myejb.incrementValue();
}
}


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· EJB (07-01) · EJB (11-23)
· EJB (08-06) · J2EE介绍-EJB-RMI-Java认证和授权-JMX (04-17)
· J2EE 组件开发:消息驱动的EJB (04-14) · J2EE之EJB种类的详细介绍 (04-14)
· JAVA高手经验之谈:J2EE应用开发阶段划分 (04-03) · EJB 3.0 的新规范概览及其未来发展 (03-26)
· EJB 最佳实践: 工业强度的 JNDI 优化 (03-19) · JAVA开源-EJB服务器之ApacheGeronimo (03-17)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 中小企业发展缓慢 电子商务存在的问题多
· 马云追加20亿投资淘宝 图谋电子商务霸主
· 国产ITIL运维先行者 四大厂商角力BI市场
· 企业信息安全解决方案 方正电子公文系统
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统