アノテーションは何をしているのか?Java の裏側で起きている処理を“やさしく深く”理解する【Java & Spring内部構造】

🧠【初心者向け】アノテーションの仕組みをやさしく解説(図解あり)

Java や Spring を触り始めると、
とにかくアノテーションが大量に登場します。

  • @Override
  • @Autowired
  • @Service
  • @RestController
  • @Transactional
  • @Entity
  • @Getter(Lombok)
  • @RequestMapping

…いったいこれら 全部何をしているの?
という疑問を持つのは自然なことです。

結論から言うと、
アノテーションは Java コンパイラやフレームワークが
「特殊な意味」 を持たせるための仕組みです。

この記事では
初心者でも分かるアノテーションの本質 を押さえつつ
裏側でどんな処理が走っているか を深掘りします。


✨ 結論

✔ アノテーションとは「コードにメタ情報(情報のための情報)を付ける仕組み」

✔ 実体はただの“印(しるし)”に過ぎない

✔ 処理をしているのは Java コンパイラ or フレームワーク

✔ Spring はアノテーションを通じて Bean 登録・DI・AOP を実現している

✔ アノテーションは“反射(Reflection)”と強く関係


アノテーションとは「メタデータ」

アノテーションは、コードに “情報” を追加するための仕組み。

たとえば👇

@Override
public void run() { ... }

この @Override 自体には“動作”はありません。
代わりに、コンパイラがチェック を行います。

🔹 図解(短線版)

コード本体
   |
   └── アノテーション(メタ情報)
            ↓
        コンパイラ or フレームワークが利用

アノテーションが扱われるタイミング(Retention)

アノテーションには「いつまで保持するか」があります。

Retention説明
SOURCEコンパイル時だけ
CLASSclassファイルに残るが実行時に参照されない
RUNTIME実行時にリフレクションで参照できる(Springはこれ)

👉 Spring のアノテーションは基本 RUNTIME


アノテーションは「実行できない」。処理をしているのは誰?

アノテーション自体には 一切の処理能力はありません

  • アノテーションはただの“印”
  • 機能を実行しているのは コンパイラ or フレームワーク

🔹 わかりやすい例

@Override

→ Java コンパイラが「正しくオーバーライドできているか」をチェック

@Getter / @Setter(Lombok)

→ Lombok がコンパイル時にコードを自動生成(注釈プロセッサ)

@Service / @RestController(Spring)

→ Spring が DIコンテナに Bean を登録するために使用

アノテーションはただの“シール”。
意味を付けて動作させるのは外側の仕組み。


Spring はアノテーションをどう使っている?

Spring はアノテーションを通じて
DI / AOP / Bean管理 / 設定 を実現しています。


@Component / @Service / @Repository は「Bean の登録指示」

🔹 図解(短線版)

@Component
class A { }

Spring:
「A を Bean としてDIコンテナに登録しよう!」

@Autowired は「依存を注入せよ」の印

Spring が以下を行う👇

  • Bean を検索
  • 型を確認
  • DI する
  • コンストラクタ or フィールドに渡す

@Transactional は「ここにトランザクション境界を作れ」の指示

Spring AOP が動き、
メソッドの前後に“代理クラス(Proxy)”が介入します。


アノテーションと Reflection の関係

アノテーションを実行時に扱うには、
Reflection(反射) を使います。

Method method = obj.getClass().getMethod("run");
Annotation[] annotations = method.getAnnotations();

Spring も内部でこれを行っています👇

  • クラスに @Component ある?
  • フィールドに @Autowired ある?
  • メソッドに @Transactional ある?

→ これを検知して、必要な処理を実行。


アノテーションのメタアノテーション(上級)

アノテーションには、アノテーションを構成するための
「メタアノテーション」 があります。

代表例👇

メタアノテーション役割
@Targetどこに付けられるか
@Retentionいつまで残すか
@DocumentedJavadocに書くか
@Inherited親クラスから継承するか

Spring の @Service などは
これらのメタアノテーションで構成されています。


実務で役立つアノテーションの勘所

✔ 「アノテーションが何をしているか」ではなく
 「誰がそのアノテーションを解釈しているか」 を理解する。

✔ Spring のアノテーションは基本 “実行時” に動く(RUNTIME)。
✔ Bean 管理・DI・AOP がどう連動しているか理解すると一気に強くなる。
✔ カスタムアノテーションは実務でもよく使う(APIログ、バリデーションなど)。


ここまでのまとめ(初心者向け)

  • アノテーションは“メタ情報”であり、処理はしない
  • 動作させているのはコンパイラ or フレームワーク
  • Spring はアノテーションで DI / AOP / 設定を実現している
  • Reflection でアノテーションを読み取り、内部処理が動く
  • メタアノテーションで細かい振る舞いが定義されている

Deep Friendly Tech の一言(後書き)

アノテーションは
“ただのシール”だけど、その裏側では膨大な処理が動いている”
という視点を持つと、Spring や Java の理解が一気に深まります。

フレームワークのコードが読めるようになり、
「なぜこのアノテーションが必要なのか?」を
本質的に判断できるエンジニアになれます。

コメント

タイトルとURLをコピーしました