2016-09-13 3 views
0

私は依存性注入に関する疑問を持っている、すべてのシングルトンので、通常、我々は、コントローラを作成するときに我々は、そのクラスのインスタンス変数としてサービスを注入したが、応じて私のコントローラ、サービス、DAOを仮定コントローラがステートレスであればシングルトンパターンには並行性の問題に直面しませんが、ここではサービス依存性を宣言してステートレスにすべきではないので、同期処理が必要です。私は完全にwrong.Please助けを考えていた場合、私は初心者ので、私は心の中でこの疑問を持っているその自然を願っていますようの理解@Repository

この疑問をクリアしてください、私は知りません。

+0

必要な同期はどのようなものですか? – OrangeDog

+0

私は単なるコントローラクラスのインジェクションサービスBeanであることを知りたいので、これを行うことで、コントローラを本質的にステートフルなものにしていますか?私がそうしているなら、間違ったことはしていません。シングルトンBeanは、並行性を防ぐためにステートレスでなければならないと言われています。 –

+0

なぜサービスはステートレスであってはならないと思いますか? すべてのシングルトンBeanはステートレス(スレッドセーフ)である必要があります – mokarakaya

答えて

0

サービスとコントローラがステートレスであれば、別のものを差し込んでも問題ありません。

あなたは、これらのクラスの状態を保つ任意の変数を宣言するべきではありません。最終的な変数はOKです。

すべての操作は、メソッドに定義されている場合、彼らはあなたがやっている依存性の注入は完全に安全である、クラスの任意の変数を使用しないでください。

+0

正確に私のポイントは、サービスクラス –

+0

のmybatisとjdbcを使用してdatasoruceをautowiredしたときに同じことが起こるかどうかを説明できますか?https://github.com/mkarakaya/spring-boot-multi-module-maven/blob /master/api/src/main/java/com/apiDemo/service/BanksService.java ご覧のとおり、すべてのオブジェクトが作成され、メソッドで使用されるため、完全にステートレスです。リポジトリクラスはシングルトンです。 – mokarakaya

+0

回答ありがとうございました:) –

0

スプリングのすべてのBeanは、デフォルトではシングルトンです。これには、@Controller,@Service@Repositoryなど、xml定義のBeanが含まれます。あなたはJava basic variable tutorialからthisthis

を読むことができる

ローカル変数オブジェクトがフィールドにその状態を保存する方法と同様に、 方法は、多くの場合、ローカル変数にその一時的な状態を保存します。ローカル変数を宣言するための構文は、 というフィールドを宣言するのと似ています(たとえば、int count = 0;)。変数としてローカル変数 を指定する特別なキーワードはありません。その決定は変数が宣言されている の場所から完全に得られます。これはメソッドの中かっこの末尾にある です。そのため、ローカル変数は、宣言されているメソッドにのみ表示される です。残りのクラスからアクセスできるのは ではありません。

+0

ありがとう、しかし私はあなたが私のコントローラがサービスBeanをautowringしているときには、サービスがステートレスであるときだけ、状態を保持していないことを理解しているので、複数のリクエストはスタックの中にあるクラスのローカルメンバー別のリクエストされたスレッド –

+0

"クラスのローカルメンバー"とはどういう意味ですか?あなたはあなたのサービス(または他のコンポーネント)にステートフルな魅力的な財産を持たせるつもりはありますか? – jlumietu

+0

申し訳ありませんが私の間違いはクラスのローカルメンバーではなく、私は本質的にpublicであるクラスのメソッドとそれらのローカル変数を意味しました –

0

従属サービスを宣言するとき、そのために@Autowiredを使用する必要があります。初期化プロセスを効果的にSpringフレームワークに渡します。 SpringにはステートレスBeanしかないので、ステートレスシングルトンを別のステートレスシングルトンに注入しているので、スレッドを手動で管理する必要はありません。