カテゴリ: Micronaut 更新日: 2026/03/19

Micronautのアノテーション一覧!@Singleton・@Injectの基本を初心者向けにやさしく解説

Micronautのアノテーション一覧!@Singleton・@Injectの基本をやさしく紹介
Micronautのアノテーション一覧!@Singleton・@Injectの基本をやさしく紹介

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

生徒

「Micronautではアノテーションをたくさん使うと聞いたんですが、何のために使うんですか?」

先生

「Micronautでは、アノテーションを使ってDIやクラスの役割を指定します。設定ファイルを書かなくても、コードだけで動作を決められるのが特徴です。」

生徒

「@Singletonとか@Injectってよく見ますが、違いが分かりません」

先生

「@Singletonは管理対象のクラスを定義するため、@Injectはそれを利用するために使います。順番に整理すると理解しやすいですよ。」

生徒

「初心者でも使いこなせますか?」

先生

「基本のアノテーションから覚えれば大丈夫です。まずは代表的なものを見ていきましょう。」

1. Micronautにおけるアノテーションの役割

1. Micronautにおけるアノテーションの役割
1. Micronautにおけるアノテーションの役割

Micronaut(マイクロノート)において、アノテーションは単なる「注釈」ではなく、プログラムの動作を制御する「司令塔」のような役割を果たします。 Javaアノテーションを活用することで、どのクラスを自動で生成するか、どのメソッドをWeb APIとして公開するかといった設定を、ソースコード上に直接記述できます。 これにより、かつてのJava開発で主流だった複雑なXML設定ファイルが不要になり、コードの見通しが劇的に向上しました。

ここがポイント!
Micronautの最大の特徴は、これらのアノテーションを「コンパイル時(プログラムを実行可能な形式に変換する時)」に解析することです。実行時に解析を行わないため、起動が非常に速く、メモリ消費量も少ないというメリットがあります。

例えば、プログラミングが初めての方でもイメージしやすいように、料理のレシピに例えてみましょう。 「材料」というクラスに「@重要」というラベル(アノテーション)を貼っておくだけで、Micronautが自動的にその材料を準備してくれるような仕組みです。 以下の簡単なコード例を見てみましょう。


// これは「このクラスはMicronautが管理する特別な部品ですよ」と教える印です
import jakarta.inject.Singleton;

@Singleton
public class GreetingService {
    // 挨拶の言葉を返すだけのシンプルな機能
    public String getMessage() {
        return "こんにちは!Micronautの世界へようこそ。";
    }
}

この例では、@Singletonというアノテーションを付けることで、このクラスを「DI(依存性注入)」という仕組みの管理対象にしています。 初心者のうちは、「アノテーションを付けるだけで、面倒なインスタンス化(newキーワードを使った生成)をフレームワークにお任せできる」と理解しておけば十分です。 このように、アノテーションを正しく使い分けることが、Micronautマスターへの第一歩となります。

2. @Singletonアノテーションの基本:インスタンスを「1つだけ」共有する

2. @Singletonアノテーションの基本:インスタンスを「1つだけ」共有する
2. @Singletonアノテーションの基本:インスタンスを「1つだけ」共有する

@Singletonは、Micronautで最も頻繁に利用されるアノテーションの一つです。 このアノテーションを付与したクラスは、MicronautのDIコンテナ(部品管理センター)によって管理される「Bean(ビーン)」となります。

「Singleton(シングルトン)」とは「単一」という意味です。その名の通り、アプリケーションが起動してから終了するまで、そのクラスのインスタンス(実体)が世界にたった1つだけ作成され、どこから呼び出されても同じものが使い回されます。

未経験者の方への例え
例えば、町に一つしかない「時計台」をイメージしてください。住民(他のクラス)が何人いても、全員が同じ一つの時計台を見て時間を確認します。誰かが新しい時計台を勝手に建てる(newする)必要はありません。Micronautが最初に立派な時計台を一つだけ建てて、みんなに貸し出してくれるイメージです。

一般的に、計算処理を行うロジックや、データベースとの通信を担当するサービスクラスなど、「状態を持たず、共通で利用したい処理」に適しています。


package com.example;

import jakarta.inject.Singleton;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

// このアノテーションで「このクラスは1つだけ作って使い回す」と指示します
@Singleton
public class TimeService {

    /**
     * 現在の時刻を分かりやすい文字列で返すメソッド
     */
    public String getCurrentTime() {
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒");
        return now.format(formatter);
    }
}

上記のコードでは、TimeServiceクラスに@Singletonを付けています。 これにより、開発者が TimeService service = new TimeService(); と手動で書かなくても、Micronautが必要な時に自動でインスタンスを生成し、準備してくれます。

管理をフレームワークに任せることで、メモリの節約になるだけでなく、「どこで誰が作ったインスタンスなのか」という混乱を避け、シンプルでメンテナンスしやすい設計を実現できるのが、@Singletonを利用する最大のメリットです。

3. @Injectアノテーションの基本

3. @Injectアノテーションの基本
3. @Injectアノテーションの基本

@Injectは、DIを利用するためのアノテーションです。 すでに定義されているBeanを、別のクラスで使いたいときに指定します。 Micronautでは、フィールド、コンストラクタ、メソッドなどに@Injectを付けることができます。

特に推奨されているのがコンストラクタインジェクションです。 依存関係が明確になり、テストしやすいコードを書くことができます。


import jakarta.inject.Inject;
import jakarta.inject.Singleton;

@Singleton
public class SampleController {

    private final TimeService timeService;

    @Inject
    public SampleController(TimeService timeService) {
        this.timeService = timeService;
    }

    public void execute() {
        System.out.println(timeService.now());
    }
}

このコードでは、SampleControllerがTimeServiceに依存しています。 @Injectによって、Micronautが自動的にTimeServiceのインスタンスを渡します。 newを使わずに利用できる点がDIの大きな特徴です。

4. フィールドインジェクションとの違い

4. フィールドインジェクションとの違い
4. フィールドインジェクションとの違い

@Injectはフィールドにも付けることができます。 ただし、初心者のうちはコンストラクタインジェクションを理解することが重要です。 フィールドインジェクションは記述が簡単ですが、依存関係が見えにくくなる欠点があります。


import jakarta.inject.Inject;
import jakarta.inject.Singleton;

@Singleton
public class FieldSample {

    @Inject
    TimeService timeService;

    public void execute() {
        System.out.println(timeService.now());
    }
}

この書き方でも動作しますが、依存関係がコード上で分かりにくくなります。 学習段階では、なぜコンストラクタインジェクションが推奨されるのかを意識することが大切です。

5. よく使われるDI関連アノテーション

5. よく使われるDI関連アノテーション
5. よく使われるDI関連アノテーション

Micronautには、@Singletonと@Inject以外にもDIに関連するアノテーションがあります。 例えば、Beanのスコープを細かく制御するものや、条件付きで有効になるものがあります。 ただし、最初の段階では基本の二つを確実に理解することが重要です。

アノテーションを使うことで、設定よりもコードを中心とした開発スタイルになります。 Javaでの開発経験があれば、自然な形でMicronautに慣れていくことができます。

6. アノテーションを理解するメリット

6. アノテーションを理解するメリット
6. アノテーションを理解するメリット

Micronautのアノテーションを理解すると、アプリケーション全体の構造が見えやすくなります。 どのクラスが管理対象で、どこで利用されているのかが一目で分かります。 これは、保守や拡張を行う際に大きな強みとなります。

初心者のうちは、まず@Singletonと@Injectを使った小さなサンプルを作り、動きを確認するのがおすすめです。 その積み重ねが、MicronautのDIとアノテーション開発への理解につながります。

関連記事:
カテゴリの一覧へ
新着記事
New1
Java
JavaのStringBufferクラスを徹底解説!スレッド安全な文字列操作の仕組みと使い分け
New2
Micronaut
Micronautで非同期HTTP処理を行う方法!リアクティブ対応の基礎知識
New3
Micronaut
Micronautの@Prototypeとは?新しいインスタンスを生成するスコープの基本
New4
Quarkus
QuarkusのCDIスコープを完全理解!@ApplicationScopedと@RequestScopedを初心者向けに徹底解説
人気記事
No.1
Java&Spring記事人気No1
Quarkus
Quarkus入門!GitHub ActionsでCI/CDパイプラインを構築して自動ビルドを実現する方法
No.2
Java&Spring記事人気No2
Java
Javaのコンパイルと実行の流れを解説!JVM・JDK・JREの違いも初心者向けに整理
No.3
Java&Spring記事人気No3
Quarkus
QuarkusのCI/CD入門!GitHub Actionsで自動デプロイを実現する方法
No.4
Java&Spring記事人気No4
Micronaut
Micronautのルーティング設定ガイド!プレフィックス付与とAPIバージョニングの基本
No.5
Java&Spring記事人気No5
Java
Java Optional ifPresentの使い方を徹底解説!nullチェックをスマートに省略する方法
No.6
Java&Spring記事人気No6
Micronaut
Micronautのフィルタ徹底解説!HTTPリクエスト共通処理をスマートに追加する方法
No.7
Java&Spring記事人気No7
Java
Java Functionインタフェースの使い方を完全ガイド!map変換と処理チェーンを理解する
No.8
Java&Spring記事人気No8
Java
JavaのString比較を徹底解説!equalsと==の違い、初心者が陥る罠とは?