コンテキスト:Webアプリケーション
Springを使用したことはありませんが、Springのドキュメントによると、singleton
として宣言しない限り、すべてのBeanはprototype
です。
通常、ビジネス/サービス層への呼び出しがある場合、新しいDAOをインスタンス化します。 RESTfullサービスの場合、呼び出しに依存するほとんどすべてのオブジェクトをインスタンス化します。
_@Repository
_を使用してデータアクセスクラスに注釈を付けたり、サービスレイヤークラスに_@Service
_を使用したりできます。
そのため、上記のアノテーションを持つ私のクラスはデフォルトでsingleton
です。プロトタイプとして宣言できる_@Scope
_注釈がありますただし、これを行う人はいないようです。
new Object();
毎回singleton
私の質問は、
@Repository
_がsingleton
である場合、そのようなことが解決されていない場合、スレッドセーフをどのように処理しますか? (春のプロキシによって行われると仮定します)@Repository
_で十分ですか、または@Scope('prototype')
を追加する方が良いでしょうか?@Scope('prototype')
を_@Repository
_と共に使用する人はいません(チュートリアル、ブログなどによる)。よく知られた理由はありますか?ありがとう
正解です。-Spring worldでは、ほとんどのBeanはシングルトンです。
- 以前の使用方法(毎回新しいインスタンスを作成する)が間違っていますか?
動作するので間違っていません。それに関する問題は、各リクエストでDAOの新しいインスタンスをインスタンス化することです-場合によっては高価であり、とにかく意味をなさないかもしれません-なぜDAOインスタンスの束が必要なのでしょうか?一方、Springはシングルトンを作成するだけでなく、DAOをサービスまたは他のDAOのe.t.cに注入します。すなわち、あなたのために多くの仕事をします
- @Repositoryがシングルトンの場合、対処されていない場合にスレッドセーフをどのように処理しますか? (春のプロキシによって行われると仮定します)
@Repository Beanを作成する場合、通常、そこにDataSourceまたはEntityManagerを挿入します。 DataSource.getConnection()メソッドはスレッドセーフである必要があります。 EntityManagerに関して、Springは、異なるスレッドに対して異なる動作をするプロキシを注入します。つまり、異なるスレッドは同じJPAセッションを共有しません。
- ベストプラクティスは何ですか、@ Repositoryで十分です。または@Scope( 'prototype')を追加することをお勧めします。
ベストプラクティス(または最も広く普及しているアプローチ)は、単に@Repositoryを使用することです
- @Scope( 'prototype')を@Repositoryで使用している人はいません(チュートリアル、ブログなどによる)。よく知られた理由はありますか?
その理由は、@ Repository Beanの複数のインスタンスを作成しても利益がないからです。
- 多数のスレッドが非常に高い頻度でDAOクラスにアクセスした場合はどうなりますか? (これは私が最も心配するものです)
繰り返しますが、ここではシングルトンの方が、リクエストごとに新しいオブジェクトを作成するよりも優れています。冗長な同期を避けて、スレッドが何らかのモニターでブロックされないようにします
いいえ、ただし、単体テストははるかに困難です。これが依存性注入のすべてです。サービスにDAOを注入することにより、テスト中に模擬DAOを注入することにより、サービスを簡単に単体テストできます。サービスが独自のDAOを作成する場合、これは不可能です。
リポジトリは、起動時に初期化されるスレッドセーフエンティティマネージャ、セッションファクトリ、またはJDBCテンプレートを除き、通常は完全にステートレスです。したがって、同時に呼び出されても問題ありません。スレッドセーフです。
リポジトリがプロトタイプになる理由はありません。プロトタイプDAOをシングルトンサービスに挿入すると、とにかく各プロトタイプが同時に呼び出されます。
それをする理由はありません。
問題ありません。正しくコーディングされていれば、スレッドセーフである必要があります。
@Repositoryアノテーションが付けられたコンポーネントはシングルトンである必要があります。これは、そのライフタイム全体にわたって複数の状態や異なる状態になることは決してないためです。はい、保持できる唯一の状態は接続オブジェクトです。これは、オブジェクトの作成中に一度だけ設定されます。また、データストアと通信するためのロジック/メソッドが含まれ、各メソッドは必要なデータオブジェクトを取得/返します。そのため、リポジトリの複数のインスタンスを持つ必要はありません。
Springは並行性の問題を処理しません。それは意図していません。アプリケーションが適切に動作できるように、作成するインスタンスの数を制御できるようにするだけです。
シングルトンスコープ(明らかに)は、指定されたBeanのインスタンスを1つだけ作成し、それをすべての依存オブジェクトに渡します。
各依存オブジェクトのプロトタイプスコープは、他のオブジェクト間で共有されない独自のインスタンスを作成します。
DAOオブジェクトの場合、データベースと通信するために複数のインスタンスが必要になることはほとんどありません。したがって、シングルトンはほとんど常に使用されます。