🧠【初心者向け】アノテーションの仕組みをやさしく解説(図解あり)
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 | コンパイル時だけ |
| CLASS | classファイルに残るが実行時に参照されない |
| 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 | いつまで残すか |
| @Documented | Javadocに書くか |
| @Inherited | 親クラスから継承するか |
Spring の @Service などは
これらのメタアノテーションで構成されています。
実務で役立つアノテーションの勘所
✔ 「アノテーションが何をしているか」ではなく
「誰がそのアノテーションを解釈しているか」 を理解する。
✔ Spring のアノテーションは基本 “実行時” に動く(RUNTIME)。
✔ Bean 管理・DI・AOP がどう連動しているか理解すると一気に強くなる。
✔ カスタムアノテーションは実務でもよく使う(APIログ、バリデーションなど)。
ここまでのまとめ(初心者向け)
- アノテーションは“メタ情報”であり、処理はしない
- 動作させているのはコンパイラ or フレームワーク
- Spring はアノテーションで DI / AOP / 設定を実現している
- Reflection でアノテーションを読み取り、内部処理が動く
- メタアノテーションで細かい振る舞いが定義されている
Deep Friendly Tech の一言(後書き)
アノテーションは
“ただのシール”だけど、その裏側では膨大な処理が動いている”
という視点を持つと、Spring や Java の理解が一気に深まります。
フレームワークのコードが読めるようになり、
「なぜこのアノテーションが必要なのか?」を
本質的に判断できるエンジニアになれます。

コメント