カテゴリ: Micronaut 更新日: 2026/01/22

Micronautの@Prototypeとは?新しいインスタンスを生成するスコープの基本

Micronautの@Prototypeとは?新しいインスタンスを生成するスコープの基本
Micronautの@Prototypeとは?新しいインスタンスを生成するスコープの基本

先生と生徒の会話形式で理解しよう

生徒

「Micronautで@Prototypeって書かれているクラスを見たんですが、@Singletonとは何が違うんですか?」

先生

「@Prototypeは、依存性注入されるたびに新しいインスタンスを生成するスコープです」

生徒

「毎回新しく作られるんですか?」

先生

「そうです。同じクラスでも、注入されるたびに別のオブジェクトになります」

生徒

「どういう場面で使い分けるのかが知りたいです」

先生

「では、@Prototypeの基本から順番に説明していきましょう」

1. Micronautにおけるスコープの基本

1. Micronautにおけるスコープの基本
1. Micronautにおけるスコープの基本

Micronautでは、DIによってオブジェクトの生成と管理をフレームワークに任せます。 その際に重要になるのがスコープという概念です。 スコープは、オブジェクトがいつ作られ、どの範囲で使われるかを決める仕組みです。

初心者が最初に触れるのは@Singletonですが、それとは対照的な存在が@Prototypeです。 この二つを理解すると、MicronautのDI設計が一気に分かりやすくなります。

2. @Prototypeとは何か

2. @Prototypeとは何か
2. @Prototypeとは何か

@Prototypeは、依存性注入されるたびに新しいインスタンスを生成するスコープです。 同じクラスであっても、使われる場所ごとに別々のオブジェクトが作られます。

そのため、状態を持つクラスや、一時的な処理を担当するクラスに向いています。 @Singletonのように使い回されることがないため、内部状態が他に影響する心配がありません。

3. @Prototypeの基本的な使い方

3. @Prototypeの基本的な使い方
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が新しいインスタンスを生成する仕組み

4. @Prototypeが新しいインスタンスを生成する仕組み
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との違いを理解する

5. @Singletonとの違いを理解する
5. @Singletonとの違いを理解する

@Singletonはアプリケーション全体で一つのインスタンスを共有します。 一方で@Prototypeは、使われるたびに新しいインスタンスを作ります。

共通処理やサービスクラスは@Singleton、 一時的な処理や状態を持つクラスは@Prototype、 というように役割で使い分けるのが基本です。 この判断ができるようになると、Micronautの設計が一段と理解しやすくなります。

6. @Prototypeが向いている具体的な場面

6. @Prototypeが向いている具体的な場面
6. @Prototypeが向いている具体的な場面

@Prototypeは、リクエストごとに異なる処理を行うクラスや、 計算途中の状態を保持するクラスに向いています。 また、短時間しか使わないオブジェクトにも適しています。

初心者のうちは、状態を持つクラスには@Prototypeを使う、 状態を持たないクラスには@Singletonを使う、 というルールを意識すると混乱しにくくなります。

7. @Prototypeを使う際の注意点

7. @Prototypeを使う際の注意点
7. @Prototypeを使う際の注意点

@Prototypeは便利ですが、インスタンス生成回数が増える点には注意が必要です。 大量に生成されると、パフォーマンスに影響する場合もあります。

そのため、本当に新しいインスタンスが必要かを考えた上で使うことが大切です。 MicronautのDIは高速ですが、設計の意図を明確にすることが重要です。

関連記事:
カテゴリの一覧へ
新着記事
New1
Quarkus
Quarkusのフォーム認証を基礎から解説!初心者向けセキュリティ入門ガイド
New2
Micronaut
MicronautプロジェクトをGradleで管理する基礎!build.gradleの役割を解説
New3
Micronaut
LinuxでMicronautをセットアップする方法!パッケージ管理とGradle連携
New4
Java
Javaのswitch文を徹底解説!case・defaultの書き方と実例まとめ
人気記事
No.1
Java&Spring記事人気No1
Quarkus
Quarkusプロジェクト構成の基本を完全解説!初心者でも迷わない「どこに何を書くか」ガイド
No.2
Java&Spring記事人気No2
Quarkus
QuarkusとMicronautとHelidonを徹底比較!軽量Javaフレームワークの違いを初心者向けに解説
No.3
Java&Spring記事人気No3
Quarkus
Quarkusのセキュリティ基礎を初心者でもわかるように解説!
No.4
Java&Spring記事人気No4
Quarkus
Quarkusの開発環境構築で躓きやすいポイントを完全解説!初心者でも安心して始めるためのチェックガイド
No.5
Java&Spring記事人気No5
Quarkus
Quarkusでマイクロサービス開発が加速する理由を徹底解説!Java初心者でも分かるクラウドネイティブ
No.6
Java&Spring記事人気No6
Micronaut
MicronautとSpring Bootの違いとは?アーキテクチャ比較で速さの秘密を理解する
No.7
Java&Spring記事人気No7
Java
Javaのboolean型の使い方を完全ガイド!真偽値と条件分岐の基本
No.8
Java&Spring記事人気No8
Micronaut
Micronautのアプリケーション起動が速い理由を初心者向けに解説