Springフレームワークでは、6つの内蔵されたspring bean scopesでBeanを作成することができ、また、カスタムのbean scopesを定義することもできます。 これらの6つのスコープのうち、4つのスコープは、Web対応のApplicationContext
を使用する場合にのみ使用できます。
Table of Contents1. Spring Bean Scope Types 1.1. singleton scope 1.2. prototype scope 1.3. request scope 1.4. session scope 1.5. application scope 1.6. websocket scope2. Custom thread scope3. Summary
Spring Beanのスコープの種類
Springでは、spring beanの@Scopeアノテーションを使用してスコープを定義できます。 ここでは、Springアプリケーションのコンテキストで使用可能な6つの内蔵Beanスコープをすべて簡単にリストアップします。 これらのスコープはspring boot beanのスコープにも当てはまります。
スコープ | 説明 |
---|---|
singleton (default) |
|
prototype |
シングルトンの反対。 これは、ビーンがリクエストされるたびに新しいインスタンスを生成します。 |
request |
単一のインスタンスが作成され、HTTPリクエストの完全なライフサイクルの間利用可能です。 |
session |
HTTPセッションの完全なライフサイクルの間、単一のインスタンスが作成され、利用可能になります。
Web対応のSpring |
application |
単一のインスタンスが作成され、ServletContext の完全なライフサイクルの間に利用可能です。
Web対応のSpring |
websocket |
1つのインスタンスが作成され、WebSocket の完全なライフサイクルの間利用可能です。
|
1.1. シングルトンスコープ
singleton
はSpringコンテナのデフォルトのビーンスコープです。 このスコープでは、コンテナごとにBeanクラスのインスタンスを1つだけ作成し、管理するように指示します。
Java configを使ったシングルトンスコープBeanの例 –
XML configを使ったシングルトンスコープBeanの例 –
1.2. プロトタイプスコープ
prototype
スコープでは、アプリケーションコードによってBeanへの要求がなされるたびに、新しいBeanインスタンスが作成されます。
破壊されたBeanのライフサイクル・メソッドはprototype
スコープのBeanでは呼び出されず、初期化コールバック・メソッドのみが呼び出されることを知っておく必要があります。 したがって、開発者としては、プロトタイプスコープのBeanインスタンスとそこにあるリソースをクリーンアップする責任があります。
プロトタイプビンスコープのJava設定例 –
@Component@Scope("prototype")public class BeanClass {}
プロトタイプビンスコープのXML設定例 –
<bean class="com.howtodoinjava.BeanClass" scope="prototype" />
prototype
singleton
スコープを使用することをお勧めします。RequestContextListener
RequestContextFilter
を登録する必要があります。1.3. リクエストスコープ
request
スコープでは、コンテナは HTTP リクエストごとに新しいインスタンスを作成します。 つまり、サーバーが現在50件のリクエストを処理している場合、コンテナは最大で50個のBeanクラスの個別インスタンスを持つことができます。 あるインスタンスの状態変化は、他のインスタンスには見えません。
Java config example of request bean scope –
@Component@Scope("request")public class BeanClass {}//or@Component@RequestScopepublic class BeanClass {}
XML config example of request bean scope –
<bean class="com.howtodoinjava.BeanClass" scope="request" />
Read More: Webサーバーの仕組み
1.4. セッションスコープ
session
スコープでは、コンテナはHTTPセッションごとに新しいインスタンスを作成します。 つまり、サーバーに20のアクティブなセッションがある場合、コンテナは最大で20のBeanクラスの個別インスタンスを持つことができます。 1つのセッション期間内のすべてのHTTPリクエストは、そのセッションスコープ内の同じ1つのBeanインスタンスにアクセスできます。
1つのインスタンスに対するいかなる状態の変更も、他のインスタンスには見えません。
セッション ビーン スコープの Java 設定例 –
@Component@Scope("session")public class BeanClass {}//or@Component@SessionScopepublic class BeanClass {}
セッション ビーン スコープの XML 設定例 –
<bean class="com.howtodoinjava.BeanClass" scope="session" />
1.5.アプリケーションスコープ
application
スコープでは、コンテナはWebアプリケーションのランタイムごとに1つのインスタンスを作成します。 これは、singleton
スコープとほぼ同様ですが、2つだけ異なる点があります。
-
application
スコープのBeanはServletContext
singleton
スコープのBeanはApplicationContext
ごとにシングルトンである。 -
application
のスコープ付きBeanはServletContext
の属性として表示されます。
アプリケーション・ビーン・スコープのJava設定例 –
@Component@Scope("application")public class BeanClass {}//or@Component@ApplicationScopepublic class BeanClass {}
アプリケーション・ビーン・スコープのXML設定例 –
<bean class="com.howtodoinjava.BeanClass" scope="application" />
1.6. WebSocketのスコープ
WebSocketプロトコルは、クライアントと、クライアントとの通信をオプトインしたリモートホストとの間で、双方向の通信を可能にします。 WebSocket プロトコルは、両方向のトラフィックに対して 1 つの TCP 接続を提供します。
この種のWebアプリケーションでは、HTTPは最初のハンドシェイクにのみ使用されます。
このタイプのWebアプリケーションでは、HTTPは最初のハンドシェイクにのみ使用されます。サーバーは、ハンドシェイク要求に同意した場合、HTTPステータス101(プロトコルの切り替え)で応答できます。 ハンドシェイクが成功すると、TCPソケットは開いたままになり、クライアントとサーバーの両方がそのソケットを使ってメッセージを送ることができます。
Websocket BeanスコープのJava設定例 –
@Component@Scope("websocket")public class BeanClass {}
Websocket BeanスコープのXML設定例 –
<bean class="com.howtodoinjava.BeanClass" scope="websocket" />
websocket
スコープされたビーンは通常シングルトンであり、個々の WebSocket セッションよりも長く存続することに注意してください。
カスタム スレッド スコープ
Spring は、SimpleThreadScope
thread
スコープも提供しています。
Beanに対するすべてのリクエストは、同じスレッド内で同じインスタンスを返します。
スレッドBeanスコープのJava設定例 –
@Component@Scope("thread")public class BeanClass {}
スレッドBeanスコープのXML設定例 –
<bean class="com.howtodoinjava.BeanClass" scope="thread" />
概要
Springフレームワークでは、6つのSpring Beanスコープが提供されており、各スコープでインスタンスのライフサイクルスパンが異なります。 開発者としては、コンテナで管理されるBeanのスコープを賢く選択しなければなりません。 また、異なるスコープを持つBeanが相互に参照する際には、賢明な判断を下さなければなりません。
上記の情報をすべて覚えて、spring beanのスコープに関するインタビューの質問に答えてみてください。
Happy Learning !!!