導入
Spring Bootのアプリは、たった数行の main メソッドで起動します。この短さの裏で、実際には何が行われているのでしょうか。
説明
Spring Bootアプリの入口は、次のような形をしています。
@SpringBootApplication
public class ShopApplication {
public static void main(String[] args) {
SpringApplication.run(ShopApplication.class, args);
}
}
@SpringBootApplication は、実は3つのアノテーションをまとめた複合アノテーションです。
graph TD SBA["@SpringBootApplication"] --> C1["@Configuration<br/>(このクラス自身も設定クラスにする)"] SBA --> C2["@ComponentScan<br/>(同じパッケージ以下を自動で走査する)"] SBA --> C3["@EnableAutoConfiguration<br/>(自動構成を有効にする)"]
SpringApplication.run(...) を呼ぶと、以下が一気に実行されます。
- ApplicationContext(DIコンテナ)を生成する。
@ComponentScanにより、@Component系のクラスをすべて集める。@EnableAutoConfigurationにより、クラスパスの内容(Tomcatがあるか、DBドライバがあるか等)を見て自動構成を適用する。- すべてのBeanを組み立て、依存関係を注入する。
- Webアプリなら、組込みTomcatを起動してリクエストを待ち受ける状態にする。
つまり、main メソッドの数行は「これだけの処理を始めてくれ」という開始の合図に過ぎず、実際の重労働はすべてSpring Boot側が担っています。開発者が ShopApplication を置いたパッケージが、コンポーネントスキャンの起点になる点も覚えておきましょう——一般的には、このクラスをプロジェクトの最上位パッケージに置きます。
やってみよう
ShopApplication を com.example.shop パッケージに置いたとき、com.example.shop.web や com.example.shop.service のようなサブパッケージにある @Service クラスは、コンポーネントスキャンの対象になるでしょうか。逆に com.example.other パッケージに置いたら、どうなるか考えてみましょう。