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