`

EJB 3.0中会话Bean,实体Bean,消息驱动Bean的作用和例子

阅读更多
关键词:EJB 3.0,会话Bean,实体Bean,消息驱动Bean
EJB 3.0规范使开发EJB比过去更容易,可能诱惑你考虑开发第一个EJB。如果真是这种情况,那么祝贺你,你已经成功避免了在你以前EJB开发者的很多挫折,并且享受到EJB 3.0开发的便利性。但是你开始开发以前,你可能想知道EJB是什么和它们用于什么目的。本篇文章解释了EJB的基础和你如何在一个J2EE程序中使用它们。

什么是EJB?
一个企业JavaBean (EJB)是一个可重用的,可移植的J2EE组件。 EJB由封装了业务逻辑的多个方法组成。例如,一个EJB可以有包括一个更新客户数据库中数据的方法的业务逻辑。多个远程和本地客户端可以调用这个方法。另外,EJB运行在一个容器里,允许开发者只关注与bean中的业务逻辑而不用考虑象事务支持,安全性和远程对象访问等复杂和容易出错的事情。EJB以 POJO或者普通旧的Java对象形式开发,开发者可以用元数据注释来定义容器如何管理这些Bean。

EJB类型
EJB主要有三种类型:会话Bean实体Bean消息驱动Bean
会话Bean完成一个清晰的解耦的任务,例如检查客户账户历史记录。
实体Bean是一个代表存在于数据库中业务对象的复杂业务实体。
消息驱动Bean用于接收异步JMS消息。让我们更详细的认识这些类型。

会话Bean
会话Bean一般代表着业务流程中象“处理订单”这样的动作。会话Bean基于是否维护过度状态分为有状态或者无状态。

无状态会话Bean没有中间状态。它们不保持追踪一个方法调用另一个方法传递的信息。因此一个无状态业务方法的每一次调用都独立于它的前一个调用;例如,税费计算或者转移账款。当计算税费额的方法被调用时,税费值被计算并返回给调用的方法,没有必要存储调用者为将来调用备用的内部状态。因为它们不维护状态,所以这些Bean是仅仅由容器管理。当客户端请求一个无状态的Bean实例时,它可以接收来自由容器管理的无状态会话Bean实例集中的一个实例。也因为无状态会话Bean能够被共享,所以容器可以维护更少数量的实例来为大量的客户端服务。简单地象该Bean增加元注释@Stateless 来指定一个 Java Bean作为一个无状态会话Bean被部署和管理。

一个有状态的会话Bean维护一个跨越多个方法调用的会话状态;例如在线购物篮应用。当客户开始在线购物时,客户的详细信息从数据库获得。相同的信息对于当客户从购物篮中增加或者移除商品等等操作时被调用的其他方法也是可访问的。但是因为该状态不是在会话结束,系统崩溃或者网络失败时保留,所以有状态会话Bean是暂时的。当一个客户端请求一个有状态会话Bean实例时,客户端将会得到一个会话实例,该Bean的状态只为给客户端维持。通过向方法增加元注释@Remove来告诉容器当某个方法调用结束一个有状态会话Bean实例应该被移除。

会话Bean实例
import javax.ejb.Stateless.*;

/**
* 一个简单无状态会话Bean实现了CalculateEJB接口的incrementValue()方法
**/

@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中所有没有@Transient元注释的变量需要考虑持久化。EJB3.0的一个主要特色是创建包含使用元数据注释的对象/关系映射实体Bean的能力。例如,指定实体Bean的empId变量映射到employee表中的EMPNO属性,象下面实例中一样用@Table(name="Employees") 注释这个表的名字和用@Column(name="EMPNO")注释empId变量。另外,EJB3.0中的一个特色是你可以很容易的在开发时测试实体 Bean,可以用Oracle Application Server Entity Test Harness在容器外部运行一个实体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应用发送异步消息,该应用能处理这些消息。实现javax.jms.MessageListener接口和使用@MessageDriven注释该Bean来指定一个Bean是消息驱动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'")
}
)

/**
*监听可配置JMS队列或者主题和通过当一个消息发送到队列或者主题
*调用它的onMessage()方法得到提醒的一个简单的消息驱动
*该Bean打印消息的内容
*/

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
客户端是访问Bean的应用程序。虽然没有必要保存在客户层,但是能够作为一个独立的应用,JSP,Servlet,或者另一个EJB。客户端通过Bean的远程或者本地接口访问EJB中的方法,主要取决于客户端和Bean运行在同一个还是不同的JVM中。这些接口定义了Bean中的方法,而由Bean类实际实现这些方法。当一个客户端访问该Bean类中的一个方法时,容器生成Bean的一个代理,被叫做远程对象或者本地对象。远程或者本地对象接收请求,委派它到相应的Bean实例,返回结果给客户端。调用一个Bean中的方法,客户端使用定义在EJB不是描述文件的名字查找到Bean。在以下实例中,客户端使用上下文对象找到命名为"StateLessejb" Bean。

EJB客户端实例
import javax.naming.Context;
import javax.naming.InitialContext;

/**
* 一个调用无状态会话Bean中方法的简单的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 3.0开发企业JavaBean是相当容易的。此规范使用元数据注释定义Bean的类型和暴露给客户端的方法。因此,无论你将创建一个执行特定任务的会话Bean还是映射一个表到实体Bean来更新数据,你都能象使用普通Java对象和接口一样进行处理,在业务方法中使用元注释向客户端暴露方法。
分享到:
评论

相关推荐

    EJB3.0源代码,包含会话Bean,实体Bean,还有消息Bean

    - **Java Persistence API (JPA)**: EJB 3.0中,实体Bean通常与JPA一起使用,JPA提供了一种统一的方式来访问和操作数据库,通过`@Table`, `@Id`, `@Column`等注解定义映射关系。 3. **消息Bean (Message-driven ...

    EJB3.0无状态SessionBean例子

    在EJB3.0中,无状态SessionBean是常用的一种组件类型,适用于处理短暂的、无持久性状态的业务逻辑。 1. **无状态SessionBean介绍** 无状态SessionBean代表了一个不保存客户端特定信息的业务逻辑组件。每次客户端...

    EJB3.0开发Session Bean.rar

    本教程将深入探讨EJB 3.0中的Session Bean,它是处理业务逻辑的主要组件。 **1. EJB 3.0概述** EJB 3.0是J2EE 5.0规范的一部分,旨在提高开发者的生产力,通过引入注解(Annotations)和依赖注入(Dependency ...

    EJB3.0开发Session Bean

    EJB 3.0中的JPA提供了强大的查询语言JPQL(Java Persistence Query Language),类似于SQL,但面向对象,可以方便地对实体进行查询和操作。同时,还可以使用 Criteria 查询API,提供更灵活的查询构建方式。 **8. ...

    EJB3.0完整代码例子

    5. **会话Bean的简化**:会话Bean(Session Beans)在EJB3.0中也得到了简化,可以声明为无状态(@Stateless)或有状态(@Stateful)。无状态Bean适用于处理不需保持上下文的请求,而有状态Bean则可以记住客户端的...

    ejb3.0开发实例(java工程)

    例如,@Stateless、@Stateful、@MessageDriven等注解分别用于声明无状态会话bean、有状态会话bean和消息驱动bean。这使得开发更加直观,提高了代码的可读性。 2. **实体Bean的简化**:EJB 3.0引入了JPA(Java ...

    EJB3.0架包

    EJB3.0中的会话Bean分为无状态(Stateless)和有状态(Stateful)两种。无状态会话Bean不保存客户端的状态,而有状态会话Bean可以跟踪客户端状态。@Stateless和@Stateful注解分别用于声明无状态和有状态会话Bean。 ...

    ejb3.0开发规范PDF

    EJB 3.0的会话Bean也进行了简化,通过`@Stateless`或`@Stateful`注解来定义无状态和有状态会话Bean。无状态会话Bean适用于方法调用不依赖于前一次调用的状态,而有状态会话Bean则保留了客户端调用之间的状态信息。 ...

    EJB 3.0无状态会话Bean应用

    该示例使用Eclipse 3.3 Europa IDE、JDK 6.0、GlassFish 2.0翻写的第一个EJB 3.0会话bean应用。注意:必须首先安装GlassFish服务器,可以通过安装NetBean 6.0(M9)来完成安装该服务器,或能单独安装也行,然后在...

    EJB3.0实例教程(PDF)

    3. **会话Bean(Session Beans)的简化**:EJB3.0的会话Bean允许开发者使用无状态(Stateless)和有状态(Stateful)两种模式。无状态会话Bean无需管理状态,而有状态会话Bean可以维护客户端的上下文信息。同时,...

    EJB3.0源代码

    总的来说,"EJB3.0源代码"的压缩包很可能包含了使用EJB 3.0规范编写的各类Bean的源码,包括实体Bean、无状态会话Bean、有状态会话Bean和消息驱动Bean,以及相关的配置文件。通过分析这些源代码,我们可以深入理解EJB...

    2022年EJB3.0之实体Bean的继承Java教程.docx

    通过这个例子,学习者能够理解如何在EJB3.0环境中实现实体Bean的继承,如何利用单一表策略来存储不同类型的数据,以及如何编写相关的Java代码和配置文件。这将有助于准备相关考试,加深对EJB3.0规范和Java企业级开发...

    EJB3.0规范中文版

    3. **消息驱动Bean(EJB Message-Driven)**:EJB 3.0引入了消息驱动Bean,它们用于处理Java Message Service (JMS) 消息。通过`@MessageDriven`注解,开发者可以创建一个监听特定消息队列或主题的Bean。 4. **依赖...

    《EJB 3.0入门经典》 源码

    1. **注解驱动**:在EJB 3.0中,开发者可以通过在类和方法上添加注解来声明实体Bean、会话Bean和消息驱动Bean,大大减少了XML配置文件的使用。 2. **简化持久化**:引入了JPA(Java Persistence API),使对象/关系...

    李腾飞EJB3.0 源码 源代码

    2. **实体Bean的简化**:EJB 3.0中的实体Bean(Entity Bean)基于JPA(Java Persistence API),采用了更直观的POJO(Plain Old Java Object)模型,允许开发者直接使用普通的Java类来表示数据库中的对象。...

    EJB3.0API.rar_ejb_ejb3.0a_ejb3.0api

    1. **注解驱动(Annotation-Based)**:在EJB 3.0中,开发者可以通过注解在类和方法级别声明bean的属性,如实体(Entity)、会话(Session)和消息驱动(Message Driven)bean,以及事务、安全性和持久化等。...

    ejb3.0规范PDF

    综上所述,ejb3.0规范PDF包含了大量的信息,从配置简化到实体Bean的JPA集成,再到会话Bean、消息驱动Bean的使用,以及依赖注入、接口驱动编程、事务管理和安全性等多个方面,为Java EE开发者提供了全面的指导。...

    EJB 3.0规范官方文档

    5. **事务管理**:EJB 3.0中的持久化操作默认是在事务上下文中进行的,确保数据一致性。 ejb-3_0-fr-spec-simplified.pdf文件可能是EJB 3.0规范的简化版,旨在帮助初学者快速理解核心概念。它可能包含: 1. **简化...

    ejb3.0 第2,3讲-开发第一个无状态会话bean和客户端

    在ejb3.0中,开发无状态会话Bean和客户端变得更为直观和简洁,这主要归功于注解的引入和JNDI查找的简化。这种改进使得Java EE应用的开发更加高效,降低了学习曲线,促进了企业级应用的普及。通过以上步骤,你可以...

    EJB3.0实例教程及源代码

    EJB 3.0的会话Bean可以分为无状态会话Bean(@Stateless)和有状态会话Bean(@Stateful),前者不维护客户端会话状态,后者则能保存。 3. **消息驱动Bean(Message-Driven Bean)**:处理JMS(Java Message Service...

Global site tag (gtag.js) - Google Analytics