Springのスコープとは?

こんにちは。ゆうせいです。

Spring Bootを使っていると、@Service@Component で登録したクラスが どのように管理されるのか 気になりませんか?
実は、Springの スコープ(Scope) という概念を知ることで、Beanのライフサイクルや管理方法を理解しやすくなります。

今回は、Springのスコープとは何か?どんな種類があるのか?どう使い分けるのか? を詳しく解説します!


1. スコープとは?

Springにおける スコープ(Scope) とは、Bean(Springが管理するオブジェクト)の生存期間(ライフサイクル)やインスタンスの管理方法 を決める仕組みです。

例えば、

  • 毎回新しいインスタンスを作るのか?
  • 1つのインスタンスを全体で共有するのか?
  • 特定のユーザーごとに別のインスタンスを作るのか?

といった制御が可能になります。


2. Springのスコープの種類

Springでは、主に以下の 5種類 のスコープが用意されています。

スコープ名説明用途
singleton(デフォルト) アプリ全体で1つのインスタンスを共有設定情報、ユーティリティクラス
prototypeリクエストのたびに新しいインスタンスを作成ステートフル(状態を持つ)なクラス
requestHTTPリクエストごとに1つのインスタンスを作成Webアプリのリクエスト単位のデータ管理
sessionユーザーセッションごとに1つのインスタンスを作成ユーザーごとのデータ管理
applicationアプリケーション全体で1つのインスタンスを共有アプリケーション設定の管理

request, session, application スコープは、Spring Webアプリ(Spring MVCなど)で使用されます。

では、それぞれのスコープを 具体的なコードとともに 見ていきましょう!


3. シングルトン(singleton

特徴

  • Springのデフォルトスコープ
  • アプリケーション全体で1つのインスタンスを共有
  • BeanはSpringコンテナ起動時に作られる
  • 状態を持たない(ステートレス)クラス向け

実装例

import org.springframework.stereotype.Service;

@Service
public class SingletonService {
    public SingletonService() {
        System.out.println("SingletonService インスタンス作成!");
    }
}

この SingletonService を呼び出してみると…

@Autowired
private SingletonService singletonService1;

@Autowired
private SingletonService singletonService2;

singletonService1singletonService2 は同じインスタンス になります。

SingletonService インスタンス作成!(1回だけ)

シングルトンは、状態を持たないクラス(ユーティリティ系など)に適している!


4. プロトタイプ(prototype

特徴

  • リクエストのたびに新しいインスタンスを作成
  • Springコンテナが管理するのはインスタンス作成のみ(ライフサイクル管理なし)
  • 状態を持つ(ステートフル)なオブジェクトに適している

実装例

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

@Service
@Scope("prototype")
public class PrototypeService {
    public PrototypeService() {
        System.out.println("PrototypeService インスタンス作成!");
    }
}

この PrototypeService を複数回呼び出すと…

@Autowired
private PrototypeService prototypeService1;

@Autowired
private PrototypeService prototypeService2;

毎回 異なるインスタンス が生成されます。

PrototypeService インスタンス作成!(2回)

プロトタイプスコープは、状態を持つクラス(ユーザーの一時データなど)に適している!


5. リクエスト(request

特徴

  • HTTPリクエストごとに新しいインスタンスが作成される
  • Webアプリ(Spring MVCなど)で使用
  • リクエストごとに異なるデータを管理するクラスに適している

実装例

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.RequestScope;

@Component
@RequestScope
public class RequestScopedBean {
    public RequestScopedBean() {
        System.out.println("RequestScopedBean インスタンス作成!");
    }
}

Webアプリで RequestScopedBean を呼び出すと、リクエストごとに異なるインスタンス が作成されます。

リクエストスコープは、リクエストごとに異なるデータを持つクラス(リクエストのトラッキング情報など)に適している!


6. セッション(session

特徴

  • ユーザーセッションごとに1つのインスタンスを保持
  • ログインユーザーごとのデータを管理するクラスに適している
  • Spring MVCで使用可能

実装例

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.SessionScope;

@Component
@SessionScope
public class SessionScopedBean {
    public SessionScopedBean() {
        System.out.println("SessionScopedBean インスタンス作成!");
    }
}

セッションスコープは、ログイン情報やユーザーごとのデータ管理に適している!


7. アプリケーション(application

特徴

  • アプリケーション全体で1つのインスタンスを共有
  • シングルトンと似ているが、Webアプリ(Servletコンテキスト)向け
  • アプリ全体の設定情報を管理するクラスに適している

実装例

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.ApplicationScope;

@Component
@ApplicationScope
public class ApplicationScopedBean {
    public ApplicationScopedBean() {
        System.out.println("ApplicationScopedBean インスタンス作成!");
    }
}

アプリケーションスコープは、アプリ全体で1つだけ管理すべきデータ(設定情報など)に適している!


まとめ

Springのスコープを正しく使うことで、Beanのライフサイクルを適切に管理できます。

スコープ用途
singleton(デフォルト)アプリ全体で1つのインスタンスを共有(状態を持たないクラス向け)
prototype毎回新しいインスタンスを作成(ステートフルなクラス向け)
requestHTTPリクエストごとに新しいインスタンスを作成(リクエストデータ管理向け)
sessionユーザーセッションごとにインスタンスを作成(ログイン情報管理向け)
applicationアプリ全体で1つのインスタンスを共有(アプリの設定管理向け)

スコープを適切に使い分けて、Springアプリをより効率的に設計しましょう!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。