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


92

CDIには、@ApplicationScopedおよび(javax.inject@Singleton疑似スコープがあります。それらの違いは何ですか?@ApplicationScopedプロキシされているという事実に加えて、プロキシされて@Singletonいません。

@SingletonBeanをに変更できます@ApplicationScopedか?@ApplicationScopedBeanは2つ(またはそれ以上)のインスタンスを持つことができますか?


11
溶接リファレンスを読みましたか?セクション5.4(p。36)@ApplicationScopedとの実際的な違いについては、いくつか説明があり@Singletonます。
brandizzi

3
また、私は、この記事の最後で違いの要約を見つけるgermanescobar.net/2010/04/...便利
マットfreake

1
参照しているシングルトンスコープ-javax.ejbまたはjavax.inject?
John Ament、2015

回答:


29

@SingletonCDI仕様の一部ではありません。これはEJBおよびjavax.inject(JSR-330)の一部です。仕様ではその動作については言及されていないため、Weldのドキュメントに記述されている内容にのみ依存できます。


11
それは真実ではない。アノテーションjavax.inject.Singletonがあります。これはCDIの一部です。ここで確認してください:docs.jboss.org/weld/reference/1.0.1-Final/en-US/html_single/...を
amorfis

5
@amorphis-CDI仕様を目の前に持っています。その一部を実装したこともあり、については何も触れられていません@Singleton。説明なしで、1つの例のみを示しています。CDIがに依存していることは事実ですjavax.injectが、厳密にはCDI仕様の一部ではありません。そうは言っても、私は私の答えを少し修正しました。
Bozho

17

つまり、それを(@Singleton@ApplicationScoped)に混ぜることもでき、いくつかのシナリオでは理にかなっています。 (そして私のものでは期待通りに動作します!)

これまでの他の回答に加えて、実際のシナリオで明確にするためにいくつかのポイントを追加したいと思います。

私にとってこの質問は、アプリケーションスコープのBeanがアプリケーションの起動時にインスタンス化するように強制する方法から生まれました。 いくつかの議論で私はこれを述べました、そして今のところそれに対する有効な議論を見つけることができません:

多くの実際のシナリオ/セットアップでは、抽象的/モデリングの観点から、何かがEJBであるか、またはアプリケーションスコープのマネージドBeanであるか(またはそのように扱われるか)かを明確に述べるのは難しいと思います。

(議論の余地がありますが、決定的なものではありません)これまでの議論(私の観点から):(@BalusCおよびその他すべて:それらが決定的なものであることを望んでいますが、そうでない場合、上記は当てはまるかもしれませんが、それでも引数はそれでも読者が違い/利点/欠点/悪い/良い習慣を得るのを助ける)

EJBとマネージドBean

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 [...]

...それは私の場合にも当てはまります。

シングルトンEJBとアプリケーションスコープBean

ロック

BalusC:シングルトンEJBは、アプリケーションスコープのBeanと同じではありません。シングルトンEJBは読み取り/書き込みロックされているため、考えていたタスクに対して非効率的/複雑すぎる可能性があります。要するに、良いJava EEの本を入手して、その仕事に適したツールの使い方を学んでください。1つの方法は他の方法とは異なります。それが機能するということは、それが適切なツールであることを意味しません。ハンマーはネジを締めることができますが、それは必ずしもそれに適したツールではありません:)

だが:

:それの良いが、(私はそれに気づいていなかった)ロックのデフォルトを知っているが、これは再び正しくないと思わ- (...申し訳ありませんが、私はここにハンマーを見ることができない)のOracle のJava EE 6チュートリアルAで同時アクセスの管理しますシングルトンセッションBean

シングルトンセッションBeanを作成する場合、シングルトンのビジネスメソッドへの同時アクセスは、コンテナ管理の同時実行とBean管理の同時実行の2つの方法で制御できます。[...]

デフォルトでは、シングルトンはコンテナー管理の並行性を使用しますが、@ ConcurrencyManagement(CONTAINER)アノテーションをシングルトンのクラスレベルで追加して、並行性管理タイプを明示的に設定できます


溶接は混合によって面白くない:アプリの読み込み中の例外:CDI定義の失敗:WELD-000046:[EnhancedAnnotatedTypeImpl] public ApplicationScoped Singleton MyClassで指定できるスコープは1つだけです。javax.inject.Singletonを使用します。
sgflt

10

通常、一部のオブジェクトのインスタンスを1つだけにする場合は、おそらく@ApplicationScopedアノテーションを使用する必要があります。そのようなオブジェクトはプロキシされているため、そのまますぐに適切にシリアル化することもできます。

一方で、クラスのインスタンスを1つだけ必要とする場合も多くありますが、そのようなクラスはプロキシできない(たとえば、最終的なものであるため)ので、それ@Singletonが助けになります。Singletonは疑似スコープであり、「通常の」スコープのようにプロキシされていないためです。


非常に不明確なので、私はこれに反対票を投じています。私はJava EEで5年間コーディングし、チュートリアルを取り、本を読んでいますが、「そのようなオブジェクトはプロキシされている」、「適切にシリアル化されている」、「疑似範囲"。あなたが話していることを知っているように聞こえるので、これが何を意味するのか知りたいのですが、それが書かれているので、あなたの答えがほとんどのJava EE開発者に役立つとは思えません。
DavidS

2
とはいえ、EJBがプロキシされていることは知っています。私の混乱は、シングルトンに対して行っている区別に部分的に関係しています。
DavidS、

9

@SingletonJSR-299 では、Singletonと呼ばれる組み込みスコープ内のJSR-299管理Beanではなくjavax.ejb.Singleton、SingletonセッションBean(でなくjavax.inject.Singleton)を指します。

@ApplicationScoped仕様では明確ではないため、EARあたり1つまたはWAR / EJB-JARあたり1つであることがサーバーで見つかるかもしれませんが、JVMごとに1つであるとは絶対に期待すべきではありません。


7

もう1つの違いがあり ます。スコープは通常のスコープではないため@Singleton、Beanはアノテーションを定義してSingletonいません。次に、@ApplicationScopedアノテーションを定義するBeanです。

CDI 1.1仕様の場合:discovery-mode = annotatedのアプリケーションの場合、Weldは@Singletonこれが読み込まれていないBeanを識別しません


2

デフォルトコンストラクターを使用してクラスを記述できる主な違いの1つは、を使用するときにプライベートアクセス修飾子javax.inject.Singletonがありますが、クラスを使用するときは、少なくともデフォルトのアクセス修飾子を使用するデフォルトコンストラクターが必要です。javax.enterprise.context.ApplicationScopedこれはJBOSS 6.1 GA Final実装です


「デフォルトのコンストラクタ」という意味ですか?
Treefish Zhang
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.