導入
前章の OrderService や MailNotifier は「Springが勝手にインスタンス化して、つないでくれる」と説明しました。でも、Springは何を見て「これを管理すべきクラスだ」と判断しているのでしょうか。
説明
Springが生成・管理するオブジェクトのことを Bean(ビーン) と呼びます。あるクラスをBeanにしてほしいと伝える一番手軽な方法が、クラスに @Component を付けることです。
@Component
class MailNotifier implements Notifier {
public void notify(String message) {
System.out.println("メール送信: " + message);
}
}
起動時、Springは指定したパッケージ配下を走査して @Component の付いたクラスを探し出します。この動作を コンポーネントスキャン(component scanning) と呼びます。
graph TD S["Spring起動"] --> Scan["コンポーネントスキャン<br/>(パッケージ配下を探索)"] Scan --> C1["@Component class MailNotifier"] Scan --> C2["@Component class OrderService"] Scan --> C3["(普通のクラス。目印なし)"] C1 --> Reg["Bean定義として登録"] C2 --> Reg C3 -.->|スキャン対象外・無視| X["Beanにならない"]
@Component は「役割を問わない」汎用の目印です。Springには、これに用途別の意味を足した特殊版が用意されています。中身はほぼ @Component と同じですが、コードを読む人にクラスの役割を伝えられます。
| アノテーション | 主な用途 |
|---|---|
@Component | 汎用(どれにも当てはまらない部品) |
@Service | 業務ロジックを持つクラス |
@Repository | データベースアクセスを担うクラス |
@Controller / @RestController | HTTPリクエストの受け口 |
前章で OrderService に @Service を付けていたのは、この特殊版を使っていたからです。「Beanにする」という効果自体は @Component と同じだと分かると、迷わず読み進められます。
やってみよう
自分がこれまで作ったことのあるクラス(OrderService のような業務ロジック、DB操作、画面処理)を思い浮かべ、それぞれ @Component @Service @Repository @Controller のどれが適切か当てはめてみましょう。役割ごとにアノテーションを使い分けると、コードの見通しがどう良くなるか考えてみてください。