上篇博客,我们对EJB进行了简单的介绍,这篇博客我们来简单介绍一下EJB的三种Bean。
一、Session Bean
会话Bean,实现会话中的业务逻辑,每当客户发出一个请求,容器会选择一个Session Bean来为客户端服务,客户端通过调用Session Bean的方法来访问数据库。
Session分为有状态Bean和无状态Bean。我们最常用的是无状态Bean。
无状态的Session Bean主要用来实现单次使用的服务,该服务能够被启用多次,但是由于无状态Session Bean并不保存任何有关状态的信息,其效果是每次调用提供单独的使用。无状态的Session Bean分为两种Local接口和Remote接口。
Remote接口:
@Stateless
@Remote
public class HelloworldBean implements Helloworld{
public String sayHello(String name){
return name + "您好!";
}
}
local接口:
@Stateless
@Local
public class HelloworldBean implements Helloworld{
public String sayHello(String name){
return name + "您好!";
}
}
有状态的Session Bean是可以维护自身状态的,每个客户都有自己的实例,在用户保存生命周期内,有状态的Session Bean保持了用户的信息,即“状态”。
建议采用有状态的Session Bean的情况:1.·Bean需要描述一个于特定客户端的会话状态;2.Bean需要在客户端的多个方法调用之间保存调用信息;3.Bean作为应用程序的其他组件和客户端的中介者,呈现一个简单化的视图给客户端;4.在调用接口里,Bean管理很多企业Bean的工作流。
二、Entity Bean
实体Bean,实现一个业务实体。Entity Bean代表真实物体的数据,Entity Bean是持久化的数据组件,代表持久存储的商业实体对象。通常情况下,每个Entity Bean对应于关系数据库中的单张表,Entity Bean的单个实例对应于表中的某一条数据。
根据永久保存方式的不同,分为BMP(Bean-Managed-Persistence 组件管理持久性)和CMP(Container-Managed-Persistence 容器管理持久性)两种。它们所实现的目的是相同的,都在于提供数据。但是这二者还存在差别,就是在于它们维护数据的角色不同。其中,BMP是由Bean自行维护数据的一致性,而CMP是有EJB容器来维护的。在BMP方式下,需要这类Bean的程序设计人员通过撰写代码来获取数据。EJB容器只会通知BMP何时可以安全的在数据库中增删改查数据,除此之外不会给予其他的协助。而在CMP方式下,CMP内并没有与数据存储有关的代码。
在EJB3.0中,Entity Bean仅作为普通的Java对象来使用,它负责跟数据库表进行对象与关系映射(O/R Mapping)。而且EJB3.0可以通过注解来映射实体:@Entity来表示这个实体是Entity Bean,@Table表示实体对应数据库的表名,@Id表示这个Bean的主键,@Column表示属性对应数据库的字段。具体参考以下代码(set get方法省略):
@Entity
@Table(name = "TB_MajorChooseCourseTime")
public class MajorChooseCourseTime{
@Id(name = "Id", length = 50)
private String Id;
@Column(name = "beginChooseTime", length = 50)
private String beginChooseTime;
@Column(name = "endChooseTime", length = 50)
private String endChooseTime;
@Column(name="isDelete",length = 50)
private int isDelete;
}
三、MessageDriven Bean
消息Bean作为JMS(Java Message Service)Java消息服务的API的监听者,异步处理其中的消息。
怎么理解JMS呢?JMS就是消息服务,一个与平台无关的API,是Java平台上有关面向消息中间件的技术规范。 MessageDriven Bean是用来专门处理基础消息请求的组件,能够轻松的与其他EJB交互。消息驱动Bean具有处理大量并发消息的能力,并且如果一个消息执行很长时间而执行结果无需向用户实时反馈时,也非常适合使用消息驱动Bean,它能够避免客户端长时间等待一个方法调用直到返回结果。比如订单成功后向用户发送一封电子邮件或短信等.
JMS有两种工作模型:点对点P2P模型和发布/订阅模型。
1.点对点模型。
P2P模型中有发送者、接收者和消息队列。每个消息只有一个消费者,即消息一旦被消费,消息就不会再在消息队列中;消息的发送者和接收者不存在时间上的依赖性,也就是说当发送者发送了消息之后,不论接收者有没有正在运行,都不影响消息被发送到队列中;接收者在成功接收了消息之后,需要给队列应答成功;每个消息都被发送到一个特定的消息队列中,接收者从消息队列中获取消息,消息队列保留着消息,直到它们被消费或超时。
2.发布/订阅模型。
Pub/Sub模型中有主题、发布者、订阅者。客户端发送消息到主题,多个发布者将消息发送到主题,系统将这些消息传递给多个订阅者。其中每个消息可以有多个消费者;发布者和订阅者之间有时间上的依赖性,针对某个主题的订阅者,他们必须建立一个订阅之后才能消费发布者的消息,并且为了消费消息,订阅者必须保持运行的状态。
小结:
1.每一种Bean都有各自不同的用法,这一点的区别还是很明显的。在合适的地方做合适的事情!
2.J2EE不是必须使用EJB,EJB并不是实现远程调用的唯一途径。在合适的需求下选择合适的框架!