Open3

@ComponentScan

がまがま

@ComponentScanで指定しなくてもSpringコンテナに登録されてるのはなぜ

がまがま

@ComponentScan は、Springフレームワークで使用されるアノテーションで、指定したパッケージ内のクラスを自動的にスキャンして、Springのコンテナに登録するために使われます。具体的には、Springが管理するBeanとして登録される対象のクラスを探し出します。

@ComponentScan がスキャンする対象

@ComponentScan がスキャンするのは、以下のアノテーションが付与されたクラスです:

  • @Component(汎用のコンポーネント)
  • @Service(ビジネスロジック層のクラス)
  • @Repository(データアクセス層のクラス)
  • @Controller(Spring MVCのコントローラクラス、@RestController を含む)
  • @Configuration(Springの設定クラス)

これらのアノテーションが付与されたクラスを、SpringのコンテナにBeanとして登録するために @ComponentScan が必要です。

@ComponentScan がなくても @RestController が認識される理由

質問のケースで @RestController@ComponentScan を使わなくても認識される理由は、Spring Bootが自動的にデフォルトでコンポーネントスキャンを実行しているからです。

Spring Bootでは、@SpringBootApplication アノテーションが通常、アプリケーションのエントリポイントに付与されます。@SpringBootApplication は、以下のアノテーションの組み合わせです:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

@SpringBootApplication@ComponentScan は、アプリケーションのメインクラスが存在するパッケージとそのサブパッケージを自動的にスキャンします。したがって、明示的に @ComponentScan を使用しなくても、アプリケーションが自動的に @RestController や他のコンポーネントをスキャンし、Springのコンテナに登録する仕組みが働きます。

まとめ

  • @ComponentScan@Component, @Service, @Repository, @Controller, @Configuration などのアノテーションが付与されたクラスをスキャンし、Springのコンテナに登録します。
  • Spring Bootでは、@SpringBootApplication によって自動的にアプリケーションのメインクラスのパッケージとそのサブパッケージがスキャンされるため、@RestController も自動的に認識されます。
  • 明示的に @ComponentScan を使う必要がない場合も、Spring Bootのデフォルトのスキャン範囲にクラスが含まれているからです。
がまがま
@ComponentScan(value = {
    "q.w.e.r"
//    "q.w.e.t"
//    "q.w.e.y"
})

で除外してみても、Scanされてたのは

q.w.e.SpringApplicationだから、r, t, yがサブパッケージとしてデフォルトスキャンされているため