2013-03-06 15 views
14

私はSpringフレームワークを学んでおり、現在、それについての本を読んでいます。 この本では、SpringのシングルトンはJavaのシングルトンとは異なると言いますか? これは何を意味し、違いは何ですか? ありがとうSpring SingletonとJava Singleeleton(デザインパターン)の違いは何ですか?

+0

あなたはすでに他の応答との違いをよく理解していますが、ここではJavaのシングルトンのテスト容易性が望ましくない理由について私の2つのセントがあります。ユニットテストを書くときに、シングルトンが状態情報を蓄積するという問題を引き起こすでしょうか? –

答えて

18

JavaシングルトンはJavaクラスローダーによってスコープされ、Springシングルトンはコンテナーコンテキストによってスコープされます。

これは基本的に、Javaでは、シングルトンが本当にそれをロードしたクラスローダーのコンテキスト内のシングルトンであることを確認できます。それ以外のクラスローダは、コードローダの他のインスタンスを作成できる必要があります(クラスローダが同じクラスローダ階層にない場合)。

Springでは、あなたのシングルトンクラスを2つの異なるコンテキストでロードし、再びシングルトンの概念を破ることができたら、

要約すると、Javaは与えられたクラスローダー内でそのクラスのインスタンスを複数作成できない場合、何かをシングルトンと見なしますが、Springはクラス内に複数のインスタンスを作成できない場合、指定されたコンテナ/コンテキスト

+0

異なるBean IDを持つ同じBean定義/構成内に同じクラスを宣言すると、同じクラスの2つの異なるインスタンスが「コンテキスト内」になります。コンテキスト/コンテナ内にシングルトンを持つことを意図している場合、これは開発者の構成ミスであると解釈することができます。シングルトンを保証しないために春を責めることはできません。私が間違っていれば私を訂正してください。 – user104309

+0

@ user104309:同じBeanを2回別々に宣言しても、1回だけ作成されます。 Springはそれを処理するのに十分スマートで、IDでインスタンスをフェッチしようとすると、 "=="比較を実行してurselfでテストできます。 – nanosoft

+0

@Edwin Dalorzo:いくつかのことを混乱させるかもしれないバネシングルトンを説明するために "コンテナ/コンテクスト"を使っているのが分かります。 Spring Beanはコンテナに対してシングルトンになりますが、コンテキスト(つまりアプリケーション)になることはありません。 – nanosoft

4

インスタンス化が1つに制限されているデザインパターンごとに、通常は JVM コードによってクラスローダーごとにJavaシングルトン。 Wikipedia

春シングルトンBeanはあなたが書いた任意の通常のクラスであってもよいが、シングルトンは、春には一つだけのインスタンスを作成し、宣言したBeanを参照するすべてのBeanへの参照を提供することを意味する、それはスコープの宣言することができます。あなたのアプリケーションにはそのクラスのインスタンスがたくさんあるかもしれませんが、にはそのbeanのものが1つしか作成されません。シングルトンとして宣言された同じクラスの複数のBeanを持つことさえできます。各Beanは、クラスのインスタンスを1つだけ作成します。 Spring 3.1 Doc

+2

+1、Springがシングルトン*クラス*ではなく、シングルトン*クラス*であることを説明するのと同じ段落で "A singleton class"と書くことに悩まされます。 ;-) – ruakh

+0

@ruakh良いキャッチ、ありがとう。 –

+1

実際はJVMではなくクラスローダーによるものです。 JVMにはいくつかのクラスローダーがあり、それらのクラスローダーのすべてがシングルトンクラスのインスタンスを持つことができます(ただし、クラスローダーの階層が同じでない場合)。 –

関連する問題