您的位置:首页 > 其它

【EJB】会话Bean(Session Bean)

2018-01-16 17:26 537 查看

前言

   会话bean封装了可以由客户端通过本地,远程或Web服务客户端视图以编程方式调用的业务逻辑。要访问部署在服务器上的应用程序,客户机将调用会话Bean的方法。会话bean为客户端执行工作,通过在服务器内执行业务任务来避免复杂性。

   会话bean不是持久的。(也就是说,它的数据不会保存到数据库中。)

叙述

会话Bean的类型

会话bean有三种类型:有状态,无状态和单例。

有状态会话Bean

  对象的状态由其实例变量的值组成。在有状态会话bean中,实例变量表示唯一客户/ bean会话的状态。由于客户端与bean交互(“对话”),这个状态通常被称为会话状态。

   顾名思义,会话bean类似于交互式会话。会话bean不共享; 它只能有一个客户端,就像一个交互式会话只能有一个用户一样。当客户端终止时,其会话bean似乎终止,不再与客户端关联。

   该状态在客户端/ bean会话期间被保留。如果客户端删除了这个bean,这个会话就结束了,这个状态就消失了。然而,这种状态的暂时性不是问题,因为当客户端和bean之间的对话结束时,不需要保持状态。

无状态会话Bean

   无状态会话bean不会与客户端保持对话状态。当客户端调用无状态bean的方法时,bean的实例变量可能包含特定于该客户端的状态,但仅在调用期间。该方法完成后,客户端特定状态不应保留。但是,客户端可能会更改共用无状态bean中的实例变量的状态,并且此状态将被保留到下一次对共用无状态bean的调用中。除了在方法调用期间,无状态bean的所有实例都是等价的,允许EJB容器将实例分配给任何客户端。也就是说,无状态会话bean的状态应该适用于所有客户端。

   因为它们可以支持多个客户端,所以无状态会话bean可以为需要大量客户端的应用程序提供更好的可伸缩性。通常情况下,应用程序需要比有状态会话bean更少的无状态会话bean来支持相同数量的客户端。

   无状态会话bean可以实现Web服务,但是有状态会话bean不能。

单例会话Bean

   单例会话bean在每个应用程序中实例化一次,并存在于应用程序的生命周期中。单例会话bean是为单个企业bean实例在客户端之间共享和并发访问的环境而设计的。

   单例会话Bean提供了与无状态会话Bean相似的功能,但与它们不同,因为每个应用程序只有一个单一会话Bean,而不是无状态会话Bean池,其中任何一个都可以响应客户端请求。像无状态会话bean一样,单例会话bean可以实现Web服务端点。

   单例会话bean在客户端调用之间保持其状态,但不需要在服务器崩溃或关闭时保持其状态。

   使用单例会话bean的应用程序可能会指定应用程序启动时单例应该被实例化,这允许单例程序为应用程序执行初始化任务。单例也可以在应用程序关闭时执行清理任务,因为单例将在应用程序的整个生命周期中运行

何时使用会话Bean

1、如果满足以下任何一个条件,则有状态会话Bean是合适的。

(1)bean的状态表示bean和特定客户端之间的交互。

(2)bean需要在方法调用中保存有关客户端的信息。

(3)该bean在客户端和应用程序的其他组件之间进行调解,为客户端提供了一个简化的视图。

(4)在幕后,这个bean管理着几个企业bean的工作流程。

2、为了提高性能,如果具有这些特性中的任何一个,你可以选择一个无状态会话bean

(1)bean的状态没有特定客户端的数据。

(2)在单个方法调用中,bean为所有客户端执行一个通用任务。例如,您可以使用无状态会话bean发送确认在线订单的电子邮件。

(3)这个bean实现了一个web服务。

3、在以下情况下,单例会话bean是合适的。

(1)状态需要在整个应用程序中共享。

(2)一个企业bean需要被多个线程同时访问。

(3)应用程序需要一个企业bean在应用程序启动和关闭时执行任务。

(4)这个bean实现了一个web服务。

代码实现

有状态会话Bean

//通过使用@Stateful定义一个简单的有状态会话Bean

import java.util.ArrayList;
import java.util.List;
//package org.sample;
//这个一个标有@Stateful注解的POJO
@Stateful
public class Cart {
List<String> items;
public Cart(){
items=new ArrayList<>();
}
public void addItem(String item){
items.add(item);
}
public void removeItem(String item){
items.remove(item);
}
public void purchase(){

}
//remove方法标有@Remove注解。客户端可以通过调用remove方法删除有状态会话Bean。
//调用这个方法将导致容器调用标有@PreDestroy注解的方法。
//删除有状态会话Bean是指特定于该客户端的实例状态已经不存在了。
@Remove
public void remove(){
items=null;
}
}
无状态会话Bean

package org.sample;

@Stateless
public class AccountSessionBean{
public float withdraw(){}
public void deposit(float amount){}

}
单例会话Bean

@Singleton
public class MySingleton{

}


小结

    会话Bean是企业Bean类型中的一种,那么另外的一种消息驱动Bean又是什么呢?这两者之间又有什么区别呢?敬请看小编的下一遍博客吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: