私はSpringフレームワークを学んでおり、現在、それについての本を読んでいます。 この本では、SpringのシングルトンはJavaのシングルトンとは異なると言いますか? これは何を意味し、違いは何ですか? ありがとうSpring SingletonとJava Singleeleton(デザインパターン)の違いは何ですか?
答えて
JavaシングルトンはJavaクラスローダーによってスコープされ、Springシングルトンはコンテナーコンテキストによってスコープされます。
これは基本的に、Javaでは、シングルトンが本当にそれをロードしたクラスローダーのコンテキスト内のシングルトンであることを確認できます。それ以外のクラスローダは、コードローダの他のインスタンスを作成できる必要があります(クラスローダが同じクラスローダ階層にない場合)。
Springでは、あなたのシングルトンクラスを2つの異なるコンテキストでロードし、再びシングルトンの概念を破ることができたら、
要約すると、Javaは与えられたクラスローダー内でそのクラスのインスタンスを複数作成できない場合、何かをシングルトンと見なしますが、Springはクラス内に複数のインスタンスを作成できない場合、指定されたコンテナ/コンテキスト
異なるBean IDを持つ同じBean定義/構成内に同じクラスを宣言すると、同じクラスの2つの異なるインスタンスが「コンテキスト内」になります。コンテキスト/コンテナ内にシングルトンを持つことを意図している場合、これは開発者の構成ミスであると解釈することができます。シングルトンを保証しないために春を責めることはできません。私が間違っていれば私を訂正してください。 – user104309
@ user104309:同じBeanを2回別々に宣言しても、1回だけ作成されます。 Springはそれを処理するのに十分スマートで、IDでインスタンスをフェッチしようとすると、 "=="比較を実行してurselfでテストできます。 – nanosoft
@Edwin Dalorzo:いくつかのことを混乱させるかもしれないバネシングルトンを説明するために "コンテナ/コンテクスト"を使っているのが分かります。 Spring Beanはコンテナに対してシングルトンになりますが、コンテキスト(つまりアプリケーション)になることはありません。 – nanosoft
インスタンス化が1つに制限されているデザインパターンごとに、通常は
JVM
コードによってクラスローダーごとにJavaシングルトン。 Wikipedia
春シングルトンBeanはあなたが書いた任意の通常のクラスであってもよいが、シングルトンは、春には一つだけのインスタンスを作成し、宣言したBeanを参照するすべてのBeanへの参照を提供することを意味する、それはスコープの宣言することができます。あなたのアプリケーションにはそのクラスのインスタンスがたくさんあるかもしれませんが、にはそのbeanのものが1つしか作成されません。シングルトンとして宣言された同じクラスの複数のBeanを持つことさえできます。各Beanは、クラスのインスタンスを1つだけ作成します。 Spring 3.1 Doc
+1、Springがシングルトン*クラス*ではなく、シングルトン*クラス*であることを説明するのと同じ段落で "A singleton class"と書くことに悩まされます。 ;-) – ruakh
@ruakh良いキャッチ、ありがとう。 –
実際はJVMではなくクラスローダーによるものです。 JVMにはいくつかのクラスローダーがあり、それらのクラスローダーのすべてがシングルトンクラスのインスタンスを持つことができます(ただし、クラスローダーの階層が同じでない場合)。 –
- 1. FlyweightとSingletonパターンの実用的な違いは何ですか?
- 2. シングルトンとレジストリのデザインパターンの違いは何ですか?
- 3. UMLとデザインパターン(GoF)の主な違いは何ですか?
- 4. デザインパターンとアーキテクチャパターンの違いは何ですか?
- 5. インターフェイスとデザインパターンの違いは何ですか?
- 6. Socialauth、Scribe-Java、Spring Socialの主な違いは何ですか?
- 7. Spring統合Java DSL - クラスHeaderEnricherとHeaderEnricherSpecの違いは何ですか
- 8. Javaの内部クラスSingletonのスコープは何ですか?
- 9. モジュールの@SingletonとDaggerのコンポーネントの@Singletonの違い
- 10. Springで-Drun.profilesと-Dspring.profiles.activeの違いは何ですか?
- 11. Spring Securityのauthenticated()とcsrfの違いは何ですか?
- 12. Spring DataのMongoTemplateとMongoRepositoryの違いは何ですか?
- 13. Spring Bootの@ComponentScanと@EnableAutoConfigurationの違いは何ですか?
- 14. SpringのResponseEntityとHttpEntityの違いは何ですか?
- 15. Spring MVCのHandlerInterceptorとHandlerInceptorAdaptorの違いは何ですか?
- 16. オープンカートのmvclデザインパターンとは何ですか?
- 17. Javaではargsとargghとargvの違いは何ですか?
- 18. **/*。javaと* .javaの違いは何ですか?
- 19. Mule Java TransformerとJava Componentの違いは何ですか
- 20. gdata-java-clientとgoogle-api-java-clientの違いは何ですか?
- 21. Java SEとJava EEの主な違いは何ですか?
- 22. Java WebアプリケーションとJava Enterprise Applicationの違いは何ですか?
- 23. マネージドBeanとSpring Controllerの違いは何ですか?
- 24. ZookeeperとSpring Cloud設定サーバーの違いは何ですか?
- 25. Spring Dispatcher ServletとWeb Deployment Discriptorの違いは何ですか?
- 26. SpringインターセプタとAOPの違いは何ですか?
- 27. EJB、hibernate、spring、JSFの違いは何ですか?
- 28. Javaのデータクラスで使用できるデザインパターンは何ですか?
- 29. GoogleApiClientデザインパターンとは何ですか?
- 30. Java generics - 違いは何ですか?
あなたはすでに他の応答との違いをよく理解していますが、ここではJavaのシングルトンのテスト容易性が望ましくない理由について私の2つのセントがあります。ユニットテストを書くときに、シングルトンが状態情報を蓄積するという問題を引き起こすでしょうか? –