Java EE 6 チュートリアルには次のように書かれています。
パフォーマンスを向上させるために、ステートレス セッション Bean が次の特性のいずれかを備えている場合は、その Bean を選択できます。
- Bean の状態には、特定のクライアントのデータがありません。
- 1 回のメソッド呼び出しで、Bean はすべてのクライアントに対して一般的なタスクを実行します。たとえば、ステートレス セッション Bean を使用して、オンライン注文を確認する電子メールを送信できます。
- Bean は Web サービスを実装します。
Singleton セッション Bean は、次の状況に適しています。
- 状態はアプリケーション全体で共有する必要があります。
- 1 つのエンタープライズ Bean に、複数のスレッドが同時にアクセスする必要があります。
- アプリケーションには、アプリケーションの起動時およびシャットダウン時にタスクを実行するエンタープライズ Bean が必要です。
- Bean は Web サービスを実装します。
しかし、次の場合は何を使用しますか:
- アプリケーション全体で状態を共有する必要はありません
- 単一のエンタープライズ Bean に複数のスレッドが同時にアクセスできる
- 起動時または停止時のタスクを実行する必要はありません
たとえば、次のインターフェイスを持つログイン サービスがあるとします。
public interface LoginService {
boolean authenticate(String user, String password);
}
@Singleton または @Stateless でアノテーションを付ける必要がありますか? 一方と他方の利点は何ですか?LoginService に (同時に使用される) EntityManager を注入する必要がある場合はどうなりますか?
追加:ステートレス シングルトンである Spring サービス Bean の Java EE 版について考えています。Java EE の対応物が @Stateless セッション Bean であり、@Singleton Bean が起動時のアプリケーションの構成またはシャットダウン時のクリーンアップ、またはアプリケーション全体のオブジェクトの保持に使用されることを正しく理解している場合。これは正しいです?