Spring Bootでは、コンテナに登録されたBeanだけが注入の対象になります。では、そのBeanはどのように登録すればよいのでしょうか。
この記事では、Beanを登録する2つの方法である「アノテーションによる自動登録」と「@Beanによる手動登録」を、コード例を交えて解説します。あわせて、コンポーネントスキャンの仕組みや、2つの登録方法の使い分けも整理します。
おさらい:注入できるのはBean

本題に入る前に、1つだけおさらいしておきましょう。
Springが注入できるのは、コンテナに登録されたBeanです。
上の図では、コンテナに登録されている MainService を、Springが MainController へ注入しています。
しかし、注入の書き方が正しくても、必要なクラスがBeanとして登録されていなければ、Springは注入できません。では、そのBeanはどのように登録するのでしょうか。次のセクションで、2つの方法を見ていきましょう。
Beanを登録する2つの方法

Beanの登録方法は、大きく分けて2つあります。
- アノテーションによる「自動登録」:クラスに
@Serviceなどのアノテーションを付けると、Springがそのクラスを見つけて、Beanとして登録します - @Configurationと@Beanを使った「手動登録」:Beanの作り方を、自分でコードに書いて登録します
まずは、この2つの登録方法があることを押さえてください。次のセクションから、それぞれを詳しく見ていきましょう。
アノテーションによる自動登録

まずは、1つ目の「自動登録」から見ていきましょう。
自動登録で行うことは、とてもシンプルです。Beanとして登録したいクラスに、アノテーションを付けます。次のコードでは、MainService クラスに @Service を付けています。
@Service
public class MainService {
// いつも通りの自作クラス
}
これだけで、Springは起動時にこのクラスを見つけ、インスタンスを生成して、Beanとしてコンテナに登録します。自分でnewしてインスタンスを作ったり、登録処理を書いたりする必要はありません。これが、アノテーションによる自動登録です。
では、@Service のほかに、どのようなアノテーションが使えるのでしょうか。次のセクションで整理します。
自動登録に使う主なアノテーション

自動登録に使う主なアノテーションは、次の5つです。
| アノテーション | 付けるクラスの用途 |
|---|---|
@Component | 汎用的なクラス |
@Service | 業務処理を担当するサービスクラス |
@Repository | データアクセスを担当するクラス |
@Controller | 画面(HTML)を返すコントローラ |
@RestController | データ(JSON)を返すコントローラ |
この5つは、Beanとして自動登録されるという点では共通しています。@Service や @Repository などは、@Component を用途別に分かりやすくしたアノテーションです。
用途ごとに使い分けることで、そのクラスがどのような役割を持つのか、ひと目で分かるようになります。第1章で解説した4つの層を思い出しながら、クラスの役割に合ったアノテーションを選びましょう。
では、Springは、これらのアノテーションが付いたクラスを、どのように見つけているのでしょうか。次のセクションで、その仕組みを見ていきます。
コンポーネントスキャン

Springが、アノテーションの付いたクラスを探す仕組みを、コンポーネントスキャンと呼びます。
Spring Bootでは標準で、@SpringBootApplication が付いた起動クラスのパッケージを基準に、その配下を探索します。
package com.example.demo;
@SpringBootApplication
public class DemoApplication {
}
上の例では、起動クラスの DemoApplication が com.example.demo パッケージにあります。パッケージ構成と探索範囲の関係は、次のとおりです。
com.example.demo配下にあるMainControllerとMainServiceは、自動登録の対象になるcom.example.toolsは探索範囲の外にあるため、SubServiceに@Serviceを付けても、Beanとして登録されない
アノテーションを付けているのに注入できない場合は、クラスが探索範囲の中に配置されているかを確認しましょう。
ここまでが、アノテーションによる自動登録です。続いて、@Bean による手動登録を見ていきます。
@Beanによる手動登録

続いて、2つ目の方法である「手動登録」を見ていきましょう。
まず、@Configuration を付けた設定クラスを用意します。次の例では、AppConfig という名前のクラスです。そして、その設定クラスの中に、@Bean を付けたメソッドを書きます。
@Configuration
public class AppConfig {
@Bean
public MainService mainService() {
return new MainService();
}
}
ポイントは、このメソッドが返すインスタンスです。@Beanを付けたメソッドが返したインスタンスを、SpringがBeanとしてコンテナに登録します。
上のコードでは、new MainService() によって MainService のインスタンスを生成し、そのまま返しています。このように手動登録では、Beanをどのように生成するのかを、自分のコードで指定できます。
この特徴がどのような場面で役立つのかは、このあとの使い分けで整理します。
@Beanの引数にも注入できる

ここは、つまずきやすいポイントです。
次の例では、MainController を生成するために、MainService が必要です。
@Bean
public MainController mainController(
MainService mainService) {
return new MainController(mainService);
}
このような場合は、@Bean メソッドの引数に、必要なBeanの型である MainService を書きます。Springは、登録済みのBeanの中からMainService型のBeanを探して、この引数へ自動で渡します。そのため、@Autowired を付ける必要はありません。
登録方法が分かったところで、次は、自動登録と手動登録の使い分けを整理しましょう。
自動登録と手動登録の使い分け

自動登録と手動登録は、どのように使い分ければよいのでしょうか。
| 登録方法 | 向いているケース | やり方 |
|---|---|---|
| 自動登録 | 自分で作ったControllerやService | アノテーションを付けるだけ |
| 手動登録 | 外部ライブラリのクラスや、生成方法を指定したいとき | @Configuration + @Bean |
自分で作ったコントローラやサービスは、基本的にアノテーションによる自動登録を使います。一方、外部ライブラリのクラスをBeanとして登録する場合や、インスタンスの生成方法を自分で指定したい場合は、@Bean による手動登録を使います。
基本は、自動登録を使うと覚えておきましょう。
続いて、Beanの登録から注入までの流れを、1枚の図で整理します。
登録から注入までの全体像

ここまでの流れを、4つのステップで整理します。
- クラスを作る:
MainServiceなどのクラスを用意する - Beanとして登録:自動登録 or 手動登録(
@Bean) - コンテナで管理:登録されたBeanをコンテナが保持する
- 必要な場所へ注入:管理しているBeanを、必要な場所へ注入する
今回学んだのは、2つ目の「Beanとして登録する」部分です。Beanとして登録されているからこそ、Springはそのインスタンスを管理し、必要な場所へ注入できます。
この関係を押さえたところで、最後に今回のポイントをまとめましょう。
まとめ

この「Beanの登録方法編」のポイントは、次の3つです。
- Beanの登録方法には、自動登録と手動登録がある
- 基本は自動登録を使い、必要な場合は
@Beanで手動登録する @Beanメソッドの引数にも、登録済みのBeanを注入できる
この3つを押さえておけば、Beanの登録から注入までの流れを理解できます。
次回の記事では、Spring Bootの開発でよく使うアノテーションを、さらに詳しく解説します。




