CDIには、@ApplicationScoped
および(javax.inject
)@Singleton
疑似スコープがあります。それらの違いは何ですか?@ApplicationScoped
プロキシされているという事実に加えて、プロキシされて@Singleton
いません。
@Singleton
Beanをに変更できます@ApplicationScoped
か?@ApplicationScoped
Beanは2つ(またはそれ以上)のインスタンスを持つことができますか?
CDIには、@ApplicationScoped
および(javax.inject
)@Singleton
疑似スコープがあります。それらの違いは何ですか?@ApplicationScoped
プロキシされているという事実に加えて、プロキシされて@Singleton
いません。
@Singleton
Beanをに変更できます@ApplicationScoped
か?@ApplicationScoped
Beanは2つ(またはそれ以上)のインスタンスを持つことができますか?
回答:
@Singleton
CDI仕様の一部ではありません。これはEJBおよびjavax.inject
(JSR-330)の一部です。仕様ではその動作については言及されていないため、Weldのドキュメントに記述されている内容にのみ依存できます。
@Singleton
。説明なしで、1つの例のみを示しています。CDIがに依存していることは事実ですjavax.inject
が、厳密にはCDI仕様の一部ではありません。そうは言っても、私は私の答えを少し修正しました。
つまり、それを(@Singleton
と@ApplicationScoped
)に混ぜることもでき、いくつかのシナリオでは理にかなっています。
(そして私のものでは期待通りに動作します!)
これまでの他の回答に加えて、実際のシナリオで明確にするためにいくつかのポイントを追加したいと思います。
私にとってこの質問は、アプリケーションスコープのBeanがアプリケーションの起動時にインスタンス化するように強制する方法から生まれました。 いくつかの議論で私はこれを述べました、そして今のところそれに対する有効な議論を見つけることができません:
多くの実際のシナリオ/セットアップでは、抽象的/モデリングの観点から、何かがEJBであるか、またはアプリケーションスコープのマネージドBeanであるか(またはそのように扱われるか)かを明確に述べるのは難しいと思います。
(議論の余地がありますが、決定的なものではありません)これまでの議論(私の観点から):(@BalusCおよびその他すべて:それらが決定的なものであることを望んでいますが、そうでない場合、上記は当てはまるかもしれませんが、それでも引数はそれでも読者が違い/利点/欠点/悪い/良い習慣を得るのを助ける)
BalusC:これはマネージドBeanではなくEJBです。これはまったく異なります。EJBはバックエンドで実行され、マネージドBeanはフロントエンドで実行されます。EJBもトランザクションコンテキストで実行されます。[...]エンタープライズBeanとマネージドBeanを混同しましたが、私はそれを指摘しました。
だが:
私:あなたは正確ではなく、意味/使用法を過大評価していると思います。私には議論の余地があるようです。http://en.wikipedia.org/wiki/Enterprise_JavaBeans
Enterprise JavaBeans(EJB)は、エンタープライズソフトウェアのモジュール構成用の管理対象サーバーソフトウェアであり、いくつかのJava APIの1つです。EJBは、アプリケーションのビジネスロジックをカプセル化するサーバー側のソフトウェアコンポーネントです。
エンタープライズBeanのタイプ
「ステートフル」、「ステートレス」、または「シングルトン」のいずれかになるセッションBean [3] [...]
メッセージ駆動型Bean [...]
...それは私の場合にも当てはまります。
BalusC:シングルトンEJBは、アプリケーションスコープのBeanと同じではありません。シングルトンEJBは読み取り/書き込みロックされているため、考えていたタスクに対して非効率的/複雑すぎる可能性があります。要するに、良いJava EEの本を入手して、その仕事に適したツールの使い方を学んでください。1つの方法は他の方法とは異なります。それが機能するということは、それが適切なツールであることを意味しません。ハンマーはネジを締めることができますが、それは必ずしもそれに適したツールではありません:)
だが:
:それの良いが、(私はそれに気づいていなかった)ロックのデフォルトを知っているが、これは再び正しくないと思わ- (...申し訳ありませんが、私はここにハンマーを見ることができない)のOracle のJava EE 6チュートリアルにAで同時アクセスの管理しますシングルトンセッションBean
シングルトンセッションBeanを作成する場合、シングルトンのビジネスメソッドへの同時アクセスは、コンテナ管理の同時実行とBean管理の同時実行の2つの方法で制御できます。[...]
デフォルトでは、シングルトンはコンテナー管理の並行性を使用しますが、@ ConcurrencyManagement(CONTAINER)アノテーションをシングルトンのクラスレベルで追加して、並行性管理タイプを明示的に設定できます
通常、一部のオブジェクトのインスタンスを1つだけにする場合は、おそらく@ApplicationScoped
アノテーションを使用する必要があります。そのようなオブジェクトはプロキシされているため、そのまますぐに適切にシリアル化することもできます。
一方で、クラスのインスタンスを1つだけ必要とする場合も多くありますが、そのようなクラスはプロキシできない(たとえば、最終的なものであるため)ので、それ@Singleton
が助けになります。Singleton
は疑似スコープであり、「通常の」スコープのようにプロキシされていないためです。
デフォルトコンストラクターを使用してクラスを記述できる主な違いの1つは、を使用するときにプライベートアクセス修飾子javax.inject.Singleton
がありますが、クラスを使用するときは、少なくともデフォルトのアクセス修飾子を使用するデフォルトコンストラクターが必要です。javax.enterprise.context.ApplicationScoped
これはJBOSS 6.1 GA Final
実装です
@ApplicationScoped
との実際的な違いについては、いくつか説明があり@Singleton
ます。