EJB 3.1 中引入了单例,提供了在多个实例之间共享状态的能力,如EJB 3.1 的采样中所述。
单身人士
EJB API 中长期存在的一个遗漏是在企业 bean 组件的多个实例之间或应用程序中的多个企业 bean 组件之间轻松共享状态的能力。相比之下,Java EE Web 应用程序编程模型始终通过 ServletConfig 对象提供这种类型的功能。在 EJB 3.1 中,通过引入单例 bean(也称为单例)解决了这一遗漏问题。
单例是一种新的会话 bean,保证为特定 Java 虚拟机 (JVM)* 中的应用程序实例化一次。使用@Singleton 注解定义单例,如以下代码示例所示:
@Singleton 公共类 PropertiesBean {
private Properties props;
private int accessCount = 0;
public String getProperty(String name) { ... }
public int getAccessCount() { ... }
因为它只是另一种形式的会话 bean,所以单例可以定义与无状态和有状态 bean 相同的本地和远程客户端视图。客户端访问单例的方式与访问无状态和有状态 bean 的方式相同,即通过 EJB 引用。例如,客户端可以按如下方式访问上述 PropertiesBean 单例:
@EJB private PropertiesBean propsBean;
...
String msg = propsBean.getProperty("hello.message"); 在这里,容器确保对同一 JVM 中所有 PropertiesBean 引用的所有调用都由同一 PropertiesBean 实例提供服务。默认情况下,容器强制执行与其他组件类型相同的线程保证。具体来说,在任何时候都只允许一次调用访问特定的 bean 实例。对于单例,这意味着阻止任何并发调用。但是,这只是默认的并发行为。还有其他并发选项允许更有效地并发访问单例实例。
查看Java EE6 Events,了解如何使用事件发送通知。