質問: SpringでWebサービスを作成しています。 「シングルトン」というキーワードについて調べていたところ、 「インスタンスの生成はコストが高いのでgetInstance()などの メソッドを作成し、インスタンスが生成されてない場合のみnewすること」とありましたが そもそもリクエストを受けて生成したインスタンスのスコープがよくわかってません。 Helloを出力するような単純なコンソールプログラムなら javaコマンドでプログラムを起動し、該当箇所(new Hello()など)でインスタンスを生成して プログラム終了時にすべて破棄されるというイメージはつきます。 Webサービスの場合はリクエストを受けてからアクションやサービスクラスの該当箇所(new Hello()など)で インスタンスを生成し、レスポンスを返すときに破棄されると思っていたのですが、 シングルトンを調べているとインスタンスを使いまわすというような記述があります。 ということは、クライアント(A)からリクエストがあり任意のインスタンス生成する処理があった場合、 生成されたインスタンスは他のクライアント(B)も参照・変更可能になっているということでしょうか?
回答: サーブレット、リクエスト、セッションなどの変数スコープについてはそれぞれのライフサイクル内で生成・終了されます。(詳しくは→サーブレットのライフサイクルとインスタンス変数 - サーブレットの基本 - サーブレット入門) よくあるシングルトンパターンでは「最初に参照されたとき」にインスタンスが生成され、以降使いまわされます。 使いまわされるのが同一プロセス内なのでtomcatのプロセスが生きてる間中ずっと残り続けるのです。