@Scopeとは?基本的な使い方から引数まで徹底解説!【初心者向け】

こんにちは!今回は、Spring Frameworkで使われるスコープを制御するアノテーション、@Scopeについて詳しく解説します。@Scopeを使えば、Spring Beanのライフサイクルや生成方法を柔軟にコントロールでき、アプリケーションの効率的な設計に役立ちます。


Beanについてわからない方はこちらの記事をどうぞ↓

@Scopeとは?

@Scopeは、Springが生成・管理するBean(クラスのインスタンス)のスコープ(有効範囲)を指定するためのアノテーションです。
Springでは、Beanのライフサイクルや生存期間を設定できますが、これによって、アプリケーションのメモリ効率や実行パフォーマンスが向上することがあります。

通常、Springではシングルトンスコープ(全アプリケーションで1つのインスタンスを使い回す)がデフォルトですが、@Scopeを使うことで、複数のインスタンスを作成する、リクエストごとに新しいインスタンスを生成するなど、柔軟にBeanの管理を行うことが可能です。

代表的なスコープの種類

  • singleton: アプリケーション全体で1つのインスタンスを共有します(デフォルト)。
  • prototype: Beanを必要に応じて新しくインスタンス化します。
  • request: HTTPリクエストごとに新しいインスタンスを生成します(Webアプリで使用)。
  • session: HTTPセッションごとに新しいインスタンスを生成します(Webアプリで使用)。
  • application: サーブレットコンテキスト全体で1つのインスタンスを共有します。

では、実際にコードを見ながら、@Scopeの使い方を学んでいきましょう!

基本的な使い方

1. Singletonスコープ(デフォルト)

まずは、Springでのデフォルトスコープであるsingletonの例です。アプリケーション全体で1つのインスタンスを共有します。

import org.springframework.stereotype.Component;

@Component
public class UserService {
    // このクラスはsingletonスコープで管理される(デフォルト)
    public String getUserInfo() {
        return "User Info";
    }
}

上記のコードでは、UserServiceクラスが@ComponentでSpring Beanとして登録されていますが、何も指定しない場合、このBeanはアプリケーション全体で1つだけインスタンスが作成されます。

2. Prototypeスコープ

prototypeスコープを指定することで、Beanが要求されるたびに新しいインスタンスが生成されます。

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

@Component
@Scope("prototype")
public class UserService {
    // このクラスはprototypeスコープで管理される
    public String getUserInfo() {
        return "User Info";
    }
}

@Scope("prototype")を付けることで、UserServiceのインスタンスは必要になるたびに新しく生成され、シングルトンのように再利用されません。たとえば、複数のユーザーが同時に異なるリクエストを送信する場合などに役立ちます。

3. Requestスコープ

次に、Webアプリケーションでよく使われるrequestスコープです。このスコープは、HTTPリクエストごとに新しいインスタンスを生成します。

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

@Component
@Scope("request")
public class UserService {
    // このクラスはrequestスコープで管理される
    public String getUserInfo() {
        return "User Info";
    }
}

この場合、1つのHTTPリクエストが送信されるたびに、新しいUserServiceのインスタンスが生成されます。ユーザーごとに独立したデータを扱いたい場合や、ステートフルな処理を行いたい場合に適しています。

4. Sessionスコープ

同様に、sessionスコープは、HTTPセッションごとにBeanのインスタンスを保持します。

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

@Component
@Scope("session")
public class UserService {
    // このクラスはsessionスコープで管理される
    public String getUserInfo() {
        return "User Info";
    }
}

ユーザーがブラウザを閉じるまで同じセッションを使い続ける場合、このセッションごとに一度だけインスタンスが生成され、セッションの有効期間中はそのインスタンスが再利用されます。

5. Applicationスコープ

最後に、applicationスコープです。これは、サーブレットコンテキスト全体で1つのインスタンスを共有します。

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

@Component
@Scope("application")
public class UserService {
    // このクラスはapplicationスコープで管理される
    public String getUserInfo() {
        return "User Info";
    }
}

アプリケーション全体で共有されるデータやサービスを保持したい場合に、このスコープが便利です。

@Scopeの応用

1. 複数のスコープを使ったアプリケーション設計

Springでは、アプリケーションの一部に対してsingletonスコープ、他の部分に対してprototyperequestスコープなど、複数のスコープを組み合わせて使うことが可能です。

例えば、セッションごとにユーザー情報を管理しつつ、個々のリクエストに応じて処理を行う場合、@Scopeを組み合わせて使うことができます。

2. カスタムスコープ

Springでは、標準のスコープ以外にも独自のスコープを定義することが可能です。特殊なシナリオに応じたカスタムスコープを使うことで、さらに柔軟なBean管理ができます。

@Scopeの引数

@Scopeアノテーションには、いくつかの引数があります。ここでは代表的なものを見ていきます。

  1. value属性
    @Scope("singleton")のように、スコープ名を文字列で指定します。デフォルトはsingletonです。
  2. proxyMode属性
    proxyModeは、SpringがBeanを生成するときの挙動を制御します。たとえば、ScopedProxyMode.TARGET_CLASSを指定すると、Beanのスコープがプロキシとして管理されます。リクエストスコープのBeanをシングルトンBean内で使いたい場合などに利用されます。
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserService {
    // セッションスコープでプロキシモードを使用
}

まとめ

今回は、Springでの**@Scope**アノテーションの基本的な使い方から応用編までを紹介しました。Beanのライフサイクルやスコープを適切に設定することで、アプリケーションのパフォーマンスやメモリ管理が効率化されます。

これを機に、さまざまなスコープの使い方を試してみてください!分かりやすくBeanの管理ができるようになれば、アプリケーション開発がもっと楽しくなるはずです。

もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。

他の記事が見たい方はこちら!↓↓↓

タイトルとURLをコピーしました