はじめに
Spring を使っていると自然と動いている仕組みのひとつに、コンポーネントスキャン(Component Scan) があります。
「@Component を付けたら勝手に動くけど、どうやって見つけてるの?」 「Bean が登録される仕組みってどうなってるの?」 そんな疑問を持つ方も多いと思います。
この記事では、コンポーネントスキャンを やさしく・実務で役立つ形 で整理します。 まずはコードを見て、そこから少しずつ理解していきましょう。
まずはコードを確認
@Service
public class GreetingService {
public String greet() {
return "Hello!";
}
}
@RestController
public class HelloController {
private final GreetingService greetingService;
public HelloController(GreetingService greetingService) {
this.greetingService = greetingService;
}
@GetMapping("/hello")
public String hello() {
return greetingService.greet();
}
}このコードでは、@Service や @RestController が付いたクラスが
自動的に Bean として登録されています。
実はこれ、コンポーネントスキャンが裏側でクラスを探してくれているおかげです。
コードのしくみを解説
コンポーネントスキャンとは
一言でいうと、
Spring が特定のパッケージを探しに行き、Bean 候補のクラスを見つけて登録する仕組み
です。
Spring Boot では、アプリ起動時に
- @Component
- @Service
- @Repository
- @Controller / @RestController
などのアノテーションが付いたクラスを探し、 IoCコンテナに Bean として登録します。
どこをスキャンしているのか
Spring Boot では、 メインクラス(@SpringBootApplication が付いたクラス)のパッケージ配下 が自動的にスキャン対象になります。
例:
com.example.demo ← メインクラス
├ controller
├ service
└ repository
この構成なら com.example.demo 以下がすべてスキャンされます。
なぜスキャンが必要なのか
理由はシンプルで、
- Bean を自動で見つけて
- 自動で登録して
- DI を自動で成立させる
という便利な仕組みを実現するためです。
開発者が「このクラスを使いたい」と意識しなくても、 Spring が勝手に準備してくれます。
あわせて知っておきたいポイント
スキャン対象を変更したい場合
@ComponentScan を使うと、スキャン範囲を自由に指定できます。
@SpringBootApplication
@ComponentScan("com.example.custom")
public class DemoApplication {
}複数指定も可能です。
Bean が見つからないときの原因
- パッケージがスキャン範囲外
- アノテーションの付け忘れ
- クラスが抽象クラスになっている
などがよくある理由です。
@Configuration と @Bean もスキャン対象
@Configuration が付いたクラスもスキャンされ、
その中の @Bean メソッドで返されたオブジェクトも Bean になります。
使うときに気をつけたいこと
メインクラスのパッケージ構成が重要
メインクラスを深い階層に置くと、
スキャン範囲が狭くなり Bean が見つからなくなることがあります。
同じ名前の Bean が複数あると競合する
スキャンによって複数の Bean が登録されると、
DI 時にどれを使うか判断できずエラーになります。
不要なパッケージをスキャンしない
広すぎるスキャン範囲は起動時間の増加につながります。
必要な範囲だけをスキャンするのが理想です。
まとめ
コンポーネントスキャンは、Spring がクラスを自動で見つけて
Bean として登録してくれる便利な仕組みです。
難しく聞こえますが、
「Spring がパッケージを探しに行って、必要なクラスを拾ってくれる」
と理解できれば十分です。

コンポーネントスキャンは普段あまり意識しませんが、
Spring の自動化を支えている大切な仕組みです。
パッケージ構成を整えるだけで動きが安定することも多いので、
ぜひ一度見直してみてください。

Spring さん、パッケージの中を探検してクラスを見つけてくれるんだね。なんだか冒険みたいで楽しそう…

コメント