本文へスキップ
BecomeCoder

Spring / Spring Bootコース · 第2章 Bean と DIコンテナ ― Springに管理してもらう部品たち · レッスン3

Beanとは何か ― @Component

ローカル実施

導入

前章の OrderServiceMailNotifier は「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 / @RestControllerHTTPリクエストの受け口

前章で OrderService@Service を付けていたのは、この特殊版を使っていたからです。「Beanにする」という効果自体は @Component と同じだと分かると、迷わず読み進められます。

やってみよう

自分がこれまで作ったことのあるクラス(OrderService のような業務ロジック、DB操作、画面処理)を思い浮かべ、それぞれ @Component @Service @Repository @Controller のどれが適切か当てはめてみましょう。役割ごとにアノテーションを使い分けると、コードの見通しがどう良くなるか考えてみてください。