CDI には、@ApplicationScoped
および ( javax.inject
)@Singleton
疑似スコープがあります。それらの違いは何ですか?@ApplicationScoped
プロキシされていることとそうでないことのほかに@Singleton
。
@Singleton
Bean をに変更できます@ApplicationScoped
か? @ApplicationScoped
Bean は 2 つ (またはそれ以上) のインスタンスを持つことができますか?
@Singleton
CDI 仕様の一部ではありません。EJB およびjavax.inject
(JSR-330) の一部です。その動作が仕様に記載されていないため、Weld のドキュメントに記載されている内容にのみ依存できます。
要するに: 混合することもでき (@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 Tutorial on Managing Concurrent Access in aシングルトン セッション Bean
シングルトン セッション Bean を作成する場合、シングルトンのビジネス メソッドへの同時アクセスは、コンテナ管理の同時実行と Bean 管理の同時実行の 2 つの方法で制御できます。[...]
デフォルトでは、シングルトンはコンテナー管理の同時実行を使用しますが、シングルトンのクラス レベルで @ConcurrencyManagement(CONTAINER) アノテーションを追加して、同時実行管理の種類を明示的に設定できます。
@Singleton
JSR-299 の は、Singletonと呼ばれる組み込みスコープの JSR-299 マネージド Bean ではなく 、Singleton セッション Bean ( javax.ejb.Singleton
、 not )を指します。javax.inject.Singleton
@ApplicationScoped
仕様では明確でないため、EAR ごとに 1 つまたは WAR/EJB-JAR ごとに 1 つがサーバー内にあることに気付くかもしれませんが、 JVM ごとに 1 つになるとは絶対に期待しないでください。
もう 1 つの違いがあり
ます。スコープは通常のスコープではないため@Singleton
、注釈を定義する Bean ではありません。Singleton
次に@ApplicationScoped
、Bean 定義のアノテーションです。
CDI 1.1 仕様の場合: アプリケーションが Discovery-mode = annotated の場合、Weld は Bean を識別せず、@Singleton
これをロードしていない
デフォルト コンストラクターを使用してクラスを記述できる主な違いの 1 つは、使用時にプライベート アクセス修飾子をjavax.inject.Singleton
持ちますが、クラスには、使用時に少なくともデフォルト アクセス修飾子を持つデフォルト コンストラクターが必要でjavax.enterprise.context.ApplicationScoped
あり、これがJBOSS 6.1 GA Final
実装です。