CDIにおける@ApplicationScopedと@Singletonのスコープの違いは何ですか?
CDI には @ApplicationScoped
と (javax.inject
) @Singleton
という擬似スコープがあります。両者の違いは何でしょうか?ApplicationScopedはプロキシされ、
@Singleton`はされないという事実の他に。
私の @Singleton
ビーンを @ApplicationScoped
に変更することは可能ですか。ApplicationScoped` ビーンは 2 つ (またはそれ以上) のインスタンスを持つことができますか?
86
3
シングルトン
はCDI仕様の一部ではありません。これはEJBと
javax.inject` (JSR-330)に含まれています。仕様書には、その動作は記載されていませんので、Weldのドキュメントに書かれていることに頼るしかありません。JSR-299 の
@Singleton
は、Singleton という組み込みスコープの JSR-299 管理 Bean ではなく、Singleton セッション Bean (javax.ejb.Singleton
, notjavax.inject.Singleton
) を指します。サーバーでは、仕様で明確になっていないため、
@ApplicationScoped
がEARごとに1つ、またはWAR/EJB-JARごとに1つであると分かるかもしれませんが、JVMごとに1つであると期待してはいけません。大きな違いは、
javax.inject.Singleton
を使用する場合は、デフォルトコンストラクタにprivateアクセス修飾子を付けてクラスを記述できますが、javax.enterprise.context.ApplicationScoped
とJBOSS 6.1 GA Final
の実装では、少なくともデフォルトアクセス修飾子を付けてクラスを記述しなければならないことです。