Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Spring Bean Scopes in Spring Boot: A Complete Guide with Examples

2025年10月02日に「Medium」が公開したITニュース「Spring Bean Scopes in Spring Boot: A Complete Guide with Examples」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Spring Bootアプリの構成要素である「Bean」は、Springが管理するオブジェクトだ。Beanスコープは、これらのBeanがいつ生成され、どこまで共有されるかを定義する重要な設定。これにより、Springが効率的にアプリの部品を制御する仕組みを学べる。

ITニュース解説

システムエンジニアを目指す上で、Spring Bootは非常に強力なフレームワークであり、その核心となる概念の一つが「Bean」と「Beanスコープ」である。Spring Bootアプリケーションは、様々な「オブジェクト」で構成されており、これら一つ一つのオブジェクトは「Bean」と呼ばれている。SpringはこれらのBeanの生成、管理、破棄といったライフサイクル全体を自動的に行ってくれるが、この管理の仕方を決定するのが「Beanスコープ」だ。Beanスコープは、アプリケーション内で特定のBeanがいくつ存在し、どのようなタイミングで生成・破棄されるかを定義する重要な設定である。

なぜこのようなBeanスコープの概念が必要なのか。アプリケーションを開発する際、全てのオブジェクトが常に一つだけ存在すれば良いというわけではない。例えば、アプリケーション全体で共通の設定情報を保持するオブジェクトは一つあれば十分だが、ユーザーからのリクエストごとに異なる情報(例えば、そのリクエストの処理状況や一時的なデータ)を保持したいオブジェクトは、リクエストごとに新しく生成されるべきだろう。もし、このような区別なく全てのオブジェクトが同じように扱われると、意図しないデータの共有や競合が発生し、アプリケーションは正しく動作しなくなる可能性がある。Beanスコープは、これらのニーズに応えるために、オブジェクトの「寿命」と「共有範囲」を細かく制御する仕組みを提供する。

Springで利用できる主なBeanスコープには、いくつか種類がある。最も基本的なものはsingletonスコープである。これはSpringのデフォルトのスコープであり、指定しなければ自動的にこのスコープが適用される。singletonスコープのBeanは、Springコンテナが起動してからアプリケーションが終了するまで、ただ一つのインスタンスだけが生成され、アプリケーション全体で共有される。つまり、どこからそのBeanを呼び出しても、常に同じオブジェクトのインスタンスが返される。共通の設定情報や、状態を持たず、複数の場所から安全に呼び出せるユーティリティクラスなどに適している。しかし、もしこのシングルトンBeanが可変な状態(データ)を持ってしまうと、複数の箇所から同時にアクセスされた際に予期せぬ結果を引き起こす可能性があるため、注意が必要だ。

次に、prototypeスコープがある。このスコープのBeanは、アプリケーションがそのBeanを要求するたびに、常に新しいインスタンスが生成される。つまり、「一つください」と頼むたびに新しいオブジェクトが渡されるイメージだ。singletonとは対照的に、全く同じオブジェクトが共有されることはなく、それぞれの呼び出し元が独立したインスタンスを持つことができる。例えば、毎回異なる計算結果を保持する必要があるオブジェクトや、他のオブジェクトに影響を与えずに独立して動作させたい場合などに利用される。新しいインスタンスの生成にはコストがかかるため、必要な場合にのみこのスコープを選択することが推奨される。

Webアプリケーション特有のスコープも存在する。requestスコープは、HTTPリクエストごとに新しいBeanのインスタンスを生成する。ユーザーがウェブページを要求(HTTPリクエストを送信)すると、そのリクエストの処理が完了するまで一つのBeanインスタンスが生存し、リクエストが終了するとそのインスタンスは破棄される。これは、特定のリクエストに関連する一時的なデータを保持するのに非常に適している。例えば、フォームから送信されたデータや、リクエスト処理中に生成される一時的なメッセージなどをBeanとして管理する際に便利だ。

sessionスコープもWebアプリケーションで利用され、HTTPセッションごとにBeanのインスタンスを生成する。セッションとは、特定のユーザーがウェブサイトにアクセスしてからログアウトする、または一定時間操作せずにタイムアウトするまでの一連のやり取りを指す。sessionスコープのBeanは、このセッション中に一貫してユーザー固有のデータを保持するために使われる。例えば、ログインしているユーザー情報や、ショッピングカートの内容など、ユーザーがサイトを閲覧している間ずっと保持したい情報に利用される。セッションが終了すると、そのBeanインスタンスも破棄される。

さらに広範囲なWebアプリケーションスコープとして、applicationスコープが存在する。これはWebアプリケーション全体で一つのインスタンスが共有されるスコープで、正確にはServletContextごとに一つだけ生成される。singletonスコープと似ているように思えるが、applicationスコープはWebコンテキストのライフサイクルに紐づく点が異なる。Webアプリケーション全体で共通の統計情報や、アプリケーションの起動時に一度だけ読み込むべき設定情報など、アプリケーションの全てのユーザー、全てのセッション、全てのリクエストからアクセスされるべきデータに適している。

Spring Framework 4.0以降で導入されたwebsocketスコープは、WebSocketのセッションごとにBeanのインスタンスを生成する。WebSocketは、一度確立された接続を通じて、クライアントとサーバー間で双方向通信を継続的に行うための技術である。websocketスコープのBeanは、特定のWebSocketセッション中に一貫してデータを保持したい場合に利用される。チャットアプリケーションなど、リアルタイム通信を伴うWebアプリケーションで、個別のWebSocket接続の状態を管理する際に役立つ。

これらのBeanスコープの適切な選択は、アプリケーションのパフォーマンス、メモリ使用量、そして何よりも安定性に直結する。誤ったスコープを選択すると、データの不整合やメモリリーク、予期せぬ動作につながることがある。例えば、本来はリクエストごとに新しいインスタンスが必要なオブジェクトを誤ってsingletonスコープにしてしまうと、複数のリクエスト間でデータが混ざり合い、全く異なるユーザーに間違った情報が表示されてしまうといった深刻なバグが発生する可能性もある。逆に、singletonで良いものを全てprototypeにしてしまうと、不要なオブジェクト生成が頻繁に行われ、パフォーマンスが低下することもある。

Spring BootにおけるBeanスコープの理解は、単にオブジェクトのライフサイクルを知るだけでなく、アプリケーションの設計思想を深く理解する上で不可欠な要素である。それぞれのスコープが持つ特性を正確に把握し、設計するアプリケーションの要件に合わせて適切に選択することで、堅牢で効率的、そして保守しやすいシステムを構築するための土台を築くことができる。システムエンジニアとしてのキャリアをスタートするにあたり、SpringがどのようにBeanを管理し、Beanスコープがその管理にどのような役割を果たすのかを学ぶことは、非常に価値のある一歩となるだろう。この知識は、より複雑なSpringアプリケーションを理解し、自身で設計・実装していくための強力な武器となるはずだ。

関連コンテンツ

関連IT用語

関連ITニュース