質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

3回答

8979閲覧

Springアプリケーションのインスタンスのスコープについて

lupus_dingo

総合スコア257

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2016/03/24 05:41

編集2016/03/24 10:34

SpringでWebサービスを作成しています。
「シングルトン」というキーワードについて調べていたところ、
「インスタンスの生成はコストが高いのでgetInstance()などの
メソッドを作成し、インスタンスが生成されてない場合のみnewすること」とありましたが
そもそもリクエストを受けて生成したインスタンスのスコープがよくわかってません。

Helloを出力するような単純なコンソールプログラムなら
javaコマンドでプログラムを起動し、該当箇所(new Hello()など)でインスタンスを生成して
プログラム終了時にすべて破棄されるというイメージはつきます。
Webサービスの場合はリクエストを受けてからアクションやサービスクラスの該当箇所(new Hello()など)で
インスタンスを生成し、レスポンスを返すときに破棄されると思っていたのですが、
シングルトンを調べているとインスタンスを使いまわすというような記述があります。
ということは、クライアント(A)からリクエストがあり任意のインスタンス生成する処理があった場合、
生成されたインスタンスは他のクライアント(B)も参照・変更可能になっているということでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A-pZ

2016/03/24 08:54

タイトルと本文が異なります。サーブレットではなくSpringアプリケーションのスコープの質問ではないでしょうか。
lupus_dingo

2016/03/24 10:34

指摘ありがとうございます。修正しました。
guest

回答3

0

シングルトンのインスタンスの、スコープは、tomcat 起動から、tomcat 終了まで。
クライアント(A)、クライアント(B) ともに 同じインスタンスに アクセスします。

投稿2016/03/24 06:17

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2016/03/24 10:09 編集

回答ありがとうございます。 tomcatが起動している間ということはサーバ再起動しない限り 同じインスタンスということですね。 同じインスタンスにアクセスしているのを確認したいのですが どうやったら簡単に確認するできるでしょうか? IDEはEclipseとほぼ同じSTSを使っています。
lupus_dingo

2016/03/24 11:21

tkturbo さんの方法で確認できました。 ありがとうございました。
guest

0

Spring frameworkで扱われる代表的なスコープの2つである シングルトン(Singleton)とプロトタイプ(Prototype)の違いについてですが、シングルトンはアプリケーションで1つのインスタンスを共有する、プロトタイプはSpringからインスタンスを取得するたびに新しく作る、の違いがあります。

なお他にもHTTPリクエスト単位でインスタンスを作るリクエスト(Request)やサーブレットのセッション単位(Session)もありますので、アプリケーションの設計にあわせてお使いください。

参考サイト:
http://javatechnology.net/spring/spring-singleton-scope/

投稿2016/03/24 07:28

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2016/03/24 10:32

回答ありがとうございます。 Controllerってシングルトンだったんですね。 参考サイトを見てみましたがアノテーションに対する理解が乏しいので 事前知識を用意してからでないとまだ理解できなそうです。 ただ、@Scope("prototype")を入れるとシングルトンじゃなくなることはわかりました。 JdbcTemplateとか決まりきった設定オブジェクトを共有するのはなんとなくわかります。 でもControllerやServiceがシングルトンということは、1ユーザの処理をしている間に他のユーザが同じインスタンスを操作する可能性があるということですが、これは極力@Scope("prototype")をつけないと処理がバッティングするのでやばいということでしょうか?
A-pZ

2016/03/30 12:44

Springでシングルトンにした場合に気を付けなければならないのが、クラスのフィールド(メンバ変数)が複数の呼び出し元から共有されてしまうことでしょうか。 ただしすべてにprototypeをつけると、呼び出されるごとにインスタンスを作りますのでそれだけメモリを消費しますし、生成の時間も多少かかります。(自動的にガベージコレクトの対象にはなるかと思いますが、破棄する処理もそれなりに時間がかかります) 一般的な作り方では、Controller層はprototypeないしはrequestにし、そこから呼び出されるクラス(Serviceなど)はsingletonであれば、たいていは問題ないかと思いますし、メンバ変数の利用も問題ないでしょう。
lupus_dingo

2016/03/31 11:24

回答ありがとうございます。 とても参考になります。
guest

0

ベストアンサー

サーブレット、リクエスト、セッションなどの変数スコープについてはそれぞれのライフサイクル内で生成・終了されます。(詳しくは→サーブレットのライフサイクルとインスタンス変数 - サーブレットの基本 - サーブレット入門
よくあるシングルトンパターンでは「最初に参照されたとき」にインスタンスが生成され、以降使いまわされます。
使いまわされるのが同一プロセス内なのでtomcatのプロセスが生きてる間中ずっと残り続けるのです。

投稿2016/03/24 07:13

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2016/03/24 10:14

回答ありがとうございます。 URL参考にさせてもらいます。 また、同じインスタンスにアクセスしているのを確認したいのですが 簡単に確認するできる方法があったら教えてほしいです。 IDEはEclipseとほぼ同じSTSを使っています。
tkturbo

2016/03/24 10:36 編集

1.外部からgetter/setterでアクセス可能なフィールドを持つシングルトンインスタンスを用意する。 2.サーブレットを二つ用意する。 3.どちらのサーブレットも内部でシングルトンなインスタンスにアクセスできるようにしておく 4.サーブレット1にアクセスしたらシングルトンインスタンスに値をsetする。 5.サーブレット2にアクセスしたらシングルトンインスタンスから値をgetして表示する。 → 4でセットされた値が5で表示されたらいいんじゃないすか?
lupus_dingo

2016/03/24 11:14 編集

回答ありがとうございます。 アドバイスを基に以下のようなクラスを作って別クラスからgetter/setterを呼んでみました。すると確かに複数回処理を呼ぶと数値がインクリメントされたので同じインスタンスを使いまわしていることが確認できました。 私はIDE上でデバッグする際、レスポンスが返るとデバッグも終了するのでそこですべてリセットされると思っていました。デバッグは終わってもいったん生成されたオブジェクトはすべて残ったままになるのですね。勉強になりました。 ******** ```java public class SingletonCheck { private static SingletonCheck instance = new SingletonCheck(); private int num; private SingletonCheck() {} public static SingletonCheck getInstance() { return instance; } public int getNum() { return this.num; } public void setNum(int i) { this.num = this.num + i ; } } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問