CDIにおける@ApplicationScopedと@Singletonのスコープの違いは何ですか?

CDI には @ApplicationScoped と (javax.inject) @Singleton という擬似スコープがあります。両者の違いは何でしょうか?ApplicationScopedはプロキシされ、@Singleton`はされないという事実の他に。

私の @Singleton ビーンを @ApplicationScoped に変更することは可能ですか。ApplicationScoped` ビーンは 2 つ (またはそれ以上) のインスタンスを持つことができますか?

シングルトンはCDI仕様の一部ではありません。これはEJBとjavax.inject` (JSR-330)に含まれています。仕様書には、その動作は記載されていませんので、Weldのドキュメントに書かれていることに頼るしかありません。

解説 (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つであると期待してはいけません。

解説 (0)

大きな違いは、javax.inject.Singletonを使用する場合は、デフォルトコンストラクタにprivateアクセス修飾子を付けてクラスを記述できますが、 javax.enterprise.context.ApplicationScopedJBOSS 6.1 GA Final の実装では、少なくともデフォルトアクセス修飾子を付けてクラスを記述しなければならないことです。

解説 (1)