シングルトンは EJB 3.1 で導入され、A Sampling of EJB 3.1 で説明されているように、複数のインスタンス間で状態を共有する機能を提供します。
シングルトン
EJB API で長年省略されていたのは、エンタープライズ Bean コンポーネントの複数のインスタンス間、またはアプリケーション内の複数のエンタープライズ Bean コンポーネント間で状態を簡単に共有する機能でした。対照的に、Java EE Web アプリケーション プログラミング モデルは、常に ServletConfig オブジェクトを通じてこのタイプの機能を提供してきました。EJB 3.1 では、シングルトンとも呼ばれるシングルトン Bean の導入により、この省略に対処しています。
シングルトンは、特定の Java 仮想マシン (JVM)* 内のアプリケーションに対して 1 回インスタンス化されることが保証されている新しい種類のセッション Bean です。次のコード例に示すように、シングルトンは @Singleton アノテーションを使用して定義されます。
@Singleton public class PropertiesBean {
private Properties props;
private int accessCount = 0;
public String getProperty(String name) { ... }
public int getAccessCount() { ... }
これはセッション Bean のもう 1 つのフレーバーであるため、シングルトンは、ステートレス Bean およびステートフル Bean と同じローカルおよびリモート クライアント ビューを定義できます。クライアントは、ステートレス Bean およびステートフル Bean にアクセスするのと同じ方法で、つまり EJB 参照を介してシングルトンにアクセスします。たとえば、クライアントは次のように上記の PropertiesBean シングルトンにアクセスできます。
@EJB private PropertiesBean propsBean;
...
String msg = propsBean.getProperty("hello.message"); ここで、コンテナーは、同じ JVM 内のすべての PropertiesBean 参照へのすべての呼び出しが、PropertiesBean の同じインスタンスによって処理されることを保証します。デフォルトでは、コンテナは他のコンポーネント タイプと同じスレッド保証を適用します。具体的には、特定の Bean インスタンスに一度にアクセスできる呼び出しは 1 つだけです。シングルトンの場合、これは同時呼び出しをブロックすることを意味します。ただし、これはデフォルトの同時実行動作です。シングルトン インスタンスへのより効率的な同時アクセスを可能にする追加の同時実行オプションがあります。
イベントを使用して通知を送信する方法については、Java EE6 イベントを参照してください。