Micronautの@Prototypeとは?新しいインスタンスを生成するスコープの基本
生徒
「Micronautで@Prototypeって書かれているクラスを見たんですが、@Singletonとは何が違うんですか?」
先生
「@Prototypeは、依存性注入されるたびに新しいインスタンスを生成するスコープです」
生徒
「毎回新しく作られるんですか?」
先生
「そうです。同じクラスでも、注入されるたびに別のオブジェクトになります」
生徒
「どういう場面で使い分けるのかが知りたいです」
先生
「では、@Prototypeの基本から順番に説明していきましょう」
1. Micronautにおけるスコープの基本
Micronautでは、DIによってオブジェクトの生成と管理をフレームワークに任せます。 その際に重要になるのがスコープという概念です。 スコープは、オブジェクトがいつ作られ、どの範囲で使われるかを決める仕組みです。
初心者が最初に触れるのは@Singletonですが、それとは対照的な存在が@Prototypeです。 この二つを理解すると、MicronautのDI設計が一気に分かりやすくなります。
2. @Prototypeとは何か
@Prototypeは、依存性注入されるたびに新しいインスタンスを生成するスコープです。 同じクラスであっても、使われる場所ごとに別々のオブジェクトが作られます。
そのため、状態を持つクラスや、一時的な処理を担当するクラスに向いています。 @Singletonのように使い回されることがないため、内部状態が他に影響する心配がありません。
3. @Prototypeの基本的な使い方
@Prototypeはクラスに付与するだけで利用できます。 特別な設定は不要で、Micronautが自動的に管理します。
import jakarta.inject.Prototype;
@Prototype
public class TaskProcessor {
private int counter = 0;
public int process() {
counter++;
return counter;
}
}
このクラスは、注入されるたびに新しいインスタンスが生成されます。 counterの値も、それぞれ独立して管理されます。
4. @Prototypeが新しいインスタンスを生成する仕組み
@Prototypeが付いたクラスは、DIコンテナにキャッシュされません。 そのため、必要になるたびにインスタンスが作成されます。
次の例では、同じクラスを二回注入した場合でも、別のオブジェクトとして扱われます。
import jakarta.inject.Singleton;
@Singleton
public class TaskRunner {
private final TaskProcessor taskProcessor1;
private final TaskProcessor taskProcessor2;
public TaskRunner(TaskProcessor taskProcessor1,
TaskProcessor taskProcessor2) {
this.taskProcessor1 = taskProcessor1;
this.taskProcessor2 = taskProcessor2;
}
public void run() {
System.out.println(taskProcessor1.process());
System.out.println(taskProcessor2.process());
}
}
1
1
出力結果からも分かるように、それぞれのTaskProcessorは別のインスタンスです。 これが@Prototypeの最大の特徴です。
5. @Singletonとの違いを理解する
@Singletonはアプリケーション全体で一つのインスタンスを共有します。 一方で@Prototypeは、使われるたびに新しいインスタンスを作ります。
共通処理やサービスクラスは@Singleton、 一時的な処理や状態を持つクラスは@Prototype、 というように役割で使い分けるのが基本です。 この判断ができるようになると、Micronautの設計が一段と理解しやすくなります。
6. @Prototypeが向いている具体的な場面
@Prototypeは、リクエストごとに異なる処理を行うクラスや、 計算途中の状態を保持するクラスに向いています。 また、短時間しか使わないオブジェクトにも適しています。
初心者のうちは、状態を持つクラスには@Prototypeを使う、 状態を持たないクラスには@Singletonを使う、 というルールを意識すると混乱しにくくなります。
7. @Prototypeを使う際の注意点
@Prototypeは便利ですが、インスタンス生成回数が増える点には注意が必要です。 大量に生成されると、パフォーマンスに影響する場合もあります。
そのため、本当に新しいインスタンスが必要かを考えた上で使うことが大切です。 MicronautのDIは高速ですが、設計の意図を明確にすることが重要です。