📅  最后修改于: 2023-12-03 15:14:51.052000             🧑  作者: Mango
EJB (Enterprise JavaBeans) 是一套 Java EE 的规范,为企业级应用提供了分布式、事务性、安全性、可伸缩性等特性。有状态 Bean 是其中一种常见的 Bean 类型,本文将介绍有状态 Bean 的概念、使用场景、生命周期以及实现方式。
有状态 Bean 在 EJB 规范中是指可以保存客户端状态的 Bean 类型,相对于无状态 Bean,有状态 Bean 可以更好地适应需要保留状态信息的业务逻辑。例如,在一个购物车应用中,需要保存当前用户的商品列表,这时候就需要使用有状态 Bean。有状态 Bean 会话的生命周期与客户端相关联,如果客户端断开连接或被销毁,那么对应的 Bean 实例也会被销毁。
有状态 Bean 适用于以下场景:
但有状态 Bean 也有一些限制:
有状态 Bean 的生命周期与客户端密切相关,其生命周期包括以下阶段:
创建阶段
当客户端请求 EJB 实例时,EJB 容器会创建一个新的实例,并将其绑定到客户端会话上。
活动阶段
在客户端会话期间,有状态 Bean 将一直存在,并且可以多次被客户端调用。在此期间,Bean 实例可以保存客户端状态信息,并对客户端请求做出响应。
销毁阶段
当客户端会话结束时,对应的 Bean 实例就会被销毁,其保存的状态信息也将被释放。
有状态 Bean 实现有两种方式:
远程接口方式
在此方式下,客户端通过远程接口调用 EJB 实例的方法,EJB 容器完成远程调用。需要定义一个远程接口,所有方法都在该接口中声明,并由 EJB 容器进行实现。
@Remote
public interface ShoppingCartRemote {
public void addItem(String item);
public void removeItem(String item);
public List<String> getItems();
}
客户端通过注入远程接口的方式获取 EJB 实例,并调用其中的方法。
@Inject
ShoppingCartRemote cart;
cart.addItem("apple");
本地接口方式
在此方式下,客户端直接调用 EJB 实例的方法,EJB 容器完成本地调用。所有方法均在 EJB 类中进行实现,无需使用接口。
@Stateful
public class ShoppingCartBean {
private List<String> items = new ArrayList<>();
public void addItem(String item) {
items.add(item);
}
public void removeItem(String item) {
items.remove(item);
}
public List<String> getItems() {
return items;
}
}
客户端通过注入 EJB 类的方式获取 EJB 实例,并调用其中的方法。
@Inject
ShoppingCartBean cart;
cart.addItem("apple");
有状态 Bean 能够更好地适应需要保留状态信息的业务逻辑,但在实际使用中需要注意一些限制。我们可以根据具体业务需求选择远程接口方式或本地接口方式进行实现。在 EJB 容器的管理下,我们可以更加简单地完成企业级应用的开发和部署。