こんにちは!今回は、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
スコープ、他の部分に対してprototype
やrequest
スコープなど、複数のスコープを組み合わせて使うことが可能です。
例えば、セッションごとにユーザー情報を管理しつつ、個々のリクエストに応じて処理を行う場合、@Scope
を組み合わせて使うことができます。
2. カスタムスコープ
Springでは、標準のスコープ以外にも独自のスコープを定義することが可能です。特殊なシナリオに応じたカスタムスコープを使うことで、さらに柔軟なBean管理ができます。
@Scopeの引数
@Scopeアノテーションには、いくつかの引数があります。ここでは代表的なものを見ていきます。
- value属性
@Scope("singleton")
のように、スコープ名を文字列で指定します。デフォルトはsingletonです。 - 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公式ドキュメントを見てみてくださいね。
他の記事が見たい方はこちら!↓↓↓