本文へスキップ
BecomeCoder

Spring / Spring Bootコース · 第3章 Spring Boot ― すぐに動くアプリを作る · レッスン10

@SpringBootApplication と起動の仕組み

ローカル実施

導入

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(...) を呼ぶと、以下が一気に実行されます。

  1. ApplicationContext(DIコンテナ)を生成する。
  2. @ComponentScan により、@Component 系のクラスをすべて集める。
  3. @EnableAutoConfiguration により、クラスパスの内容(Tomcatがあるか、DBドライバがあるか等)を見て自動構成を適用する。
  4. すべてのBeanを組み立て、依存関係を注入する。
  5. Webアプリなら、組込みTomcatを起動してリクエストを待ち受ける状態にする。

つまり、main メソッドの数行は「これだけの処理を始めてくれ」という開始の合図に過ぎず、実際の重労働はすべてSpring Boot側が担っています。開発者が ShopApplication を置いたパッケージが、コンポーネントスキャンの起点になる点も覚えておきましょう——一般的には、このクラスをプロジェクトの最上位パッケージに置きます。

やってみよう

ShopApplicationcom.example.shop パッケージに置いたとき、com.example.shop.webcom.example.shop.service のようなサブパッケージにある @Service クラスは、コンポーネントスキャンの対象になるでしょうか。逆に com.example.other パッケージに置いたら、どうなるか考えてみましょう。