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 ApplicationContextでのみ有効です。

application 単一のインスタンスが作成され、ServletContextの完全なライフサイクルの間に利用可能です。

Web対応のSpring ApplicationContextでのみ有効です。

websocket 1つのインスタンスが作成され、WebSocketの完全なライフサイクルの間利用可能です。

ApplicationContext

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" />
原則的には。 原則として、すべてのステートフル・ビーンには prototypesingleton スコープを使用することをお勧めします。
リクエスト、セッション、アプリケーション、ウェブソケットの各スコープで豆を使用するには、RequestContextListenerRequestContextFilterを登録する必要があります。

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つだけ異なる点があります。

  1. applicationスコープのBeanはServletContextsingletonスコープのBeanはApplicationContextごとにシングルトンである。
  2. 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 は、SimpleThreadScopethread スコープも提供しています。

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 !!!

Was this post helpful?

この記事が気に入ったら、ぜひ教えてください。
Yes
No

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です