@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
がサブパッケージとしてデフォルトスキャンされているため