`
isiqi
  • 浏览: 16058784 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

EJB 3.0的三大类型详解

阅读更多
  无论你创建bean会话是为了执行特定任务,还是把表映射到实体bean以更新数据,都可以使用普通的Java对象和接口来完成这些工作,并且可以通过在业务方法中使用注释,把方法提供给客户端。
  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。

本文转自
http://java.chinaitlab.com/EJB/356299.html
分享到:
评论

相关推荐

    yeclipse7.0+JBoss5.0测试EJB3.0环境搭建过程详解

    yeclipse7.0+JBoss5.0测试EJB3.0环境搭建过程详解

    ejb3.0入门图文教程

    ejb3.0入门教程。 详解! 本教程详细的讲述了ejb3.0入门的配制、开发环境、以及基本操作等!

    EJB3.0详解

    EJB3.0详解.doc

    EJB3.0_jBuilder_StepByStep.rar_2007

    Jbuilder 2007 开发EJB3.0 Entity 详解教程,通过图例一步一步教你掌握。

    EJB3.0(入门教程+最新教程+文档+应用开发详解+编程实例(源代码)).rar

    EJB3.0(入门教程+最新教程+文档+应用开发详解+编程实例).rar 一次下载 很多都有 。要是没积分给我907384382@qq.com邮箱说一下,发给你

    ejb调用详解

    主要讲解了如何远程调用websphare中的ejb组建,以及ejb开发实例,ejb开发框架等

    Hibernate实战(第2版 中文高清版)

     17.1.2 EJB 3.0详解   17.1.3 用JSF和EJB 3.0编写Web应用程序   17.1.4 分析应用程序   17.2 用Seam改善应用程序   17.2.1 配置Seam   17.2.2 将页面绑定到有状态的Seam组件   17.2.3 分析Seam应用...

    J2EE应用开发详解

    172 10.5 小结 177 第11章 EJB 179 11.1 EJB简介 179 11.1.1 EJB的特点 179 11.1.2 EJB类型与组成 180 11.1.3 EJB 3.0的新特性 181 11.2 元数据注释和部署描述符 181 11.2.1 元数据注释 181 11.2.2 部署描述符 182 ...

    传智播客JAVA全套种子共20G

    《EJB3.0视频教程》180M 《JDBC视频教程》664M 《jpa详解视频教程》165M 《spring2.5视频教程》365M 《传智播客_AJAX视频教程》1.27G 《传智播客_FTP视频教程》117M 《传智播客_hibernate视频教程》573M 《传智播客_...

    传智播客精品就业班JAVA种子

    《传智播客_AJAX视频教程》1.27G 《传智播客_FTP视频教程》117M 《传智播客_hibernate视频教程》573M ...《EJB3.0视频教程》180M 《JDBC视频教程》664M 《jpa详解视频教程》165M 《spring2.5视频教程》365M

    整理后java开发全套达内学习笔记(含练习)

    注意:默认类型转换(自动类型提升)会丢失精度,但只有三种情况: int>float; long>float; long>double. 看一下他们的有效位就明白。 二进制是无法精确的表示 0.1 的。 进行高精度运算可以用java.math包中...

Global site tag (gtag.js) - Google Analytics