QuarkusのCDIスコープを完全理解!@ApplicationScopedと@RequestScopedを初心者向けに徹底解説
生徒
「QuarkusでDIとかCDIって出てくるんですが、スコープって何を意味しているんですか?」
先生
「スコープは、そのクラスのインスタンスが、いつ作られて、どのくらいの間使われるかを決める仕組みです。」
生徒
「@ApplicationScopedや@RequestScopedをよく見ますが、違いがよく分かりません。」
先生
「では、QuarkusとCDIの基本から順番に、初心者でもイメージできるように説明していきましょう。」
1. QuarkusとCDIの関係をざっくり理解しよう
Quarkusは、Javaで高速なWebアプリケーションやREST APIを作るためのフレームワークです。 Quarkusの大きな特徴の一つが、CDIという仕組みを使ったDIです。 CDIは、オブジェクトの生成や管理をフレームワークに任せるための仕組みで、プログラムを書く人は「何を使いたいか」だけを意識すればよくなります。 このCDIで重要になるのが、スコープという考え方です。 スコープを理解すると、Quarkusで書かれているコードの意味が一気に分かりやすくなります。
2. CDIスコープとは何かをイメージで考える
CDIスコープとは、そのクラスのインスタンスが「いつ作られ」「いつまで使われるか」を決めるルールです。 たとえば、アプリ全体で一つだけ使い回したいものもあれば、リクエストごとに新しく作りたいものもあります。 Quarkusでは、この違いをアノテーションで指定します。 初心者のうちは、まず「アプリ全体で一つ」か「アクセスごとに一つ」という感覚を持つことが大切です。
3. ApplicationScopedの基本的な考え方
ApplicationScopedは、アプリケーション全体で一つのインスタンスを使い回すスコープです。 Quarkusが起動したときに一度だけ作られ、アプリが終了するまで同じものが使われます。 設定情報や共通処理など、どこから呼ばれても同じでよい処理に向いています。 何度も新しく作られないので、パフォーマンスの面でもメリットがあります。
import jakarta.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class GreetingService {
public String hello() {
return "Hello Quarkus!";
}
}
このクラスは、アプリ全体で一つだけ作られ、何度リクエストが来ても同じインスタンスが使われます。 初心者のうちは「ずっと生きているクラス」と覚えると分かりやすいです。
4. RequestScopedの基本的な考え方
RequestScopedは、HTTPリクエストごとに新しく作られるスコープです。 Web画面を開いたり、REST APIを呼び出したりするたびに、新しいインスタンスが作られます。 一つのリクエストの中でだけ使われ、処理が終わると破棄されます。 ユーザーごとに違うデータを扱う場合に向いています。
import jakarta.enterprise.context.RequestScoped;
@RequestScoped
public class AccessLogService {
public String log() {
return "request accessed";
}
}
このクラスは、アクセスされるたびに新しく作られます。 同時に複数の人がアクセスしても、それぞれ別のインスタンスが使われるので安心です。
5. ApplicationScopedとRequestScopedの違いを比較する
ApplicationScopedは、アプリ全体で共有される一つのインスタンスです。 RequestScopedは、リクエスト単位で作られる一時的なインスタンスです。 たとえば、設定値を返すだけの処理はApplicationScopedが向いています。 一方で、リクエストの内容に応じて変わる処理はRequestScopedが適しています。 どちらを使うかは、「いつまでその情報を使いたいか」で考えると判断しやすくなります。
import jakarta.inject.Inject;
public class SampleResource {
@Inject
GreetingService greetingService;
@Inject
AccessLogService accessLogService;
public String execute() {
return greetingService.hello() + " / " + accessLogService.log();
}
}
6. 初心者がつまずきやすいポイントと注意点
初心者がよく迷うのが、どのスコープを使えばよいか分からない点です。 最初は、共通処理はApplicationScoped、リクエスト依存の処理はRequestScopedと覚えておけば問題ありません。 また、ApplicationScopedで状態を持つ場合は注意が必要です。 複数のリクエストから同時に使われるため、値を書き換える処理を書くと予期しない動きになることがあります。 まずは状態を持たないクラスとして使うのが安全です。
@ApplicationScoped
public class CounterService {
private int count = 0;
public int increment() {
count++;
return count;
}
}
このようなコードは、学習用としては理解しやすいですが、実際の開発では注意が必要です。 スコープの特性を意識することが、QuarkusとCDIを正しく使う第一歩になります。