Webエンジニアのメモ帳

技術的な話を中心に書いています。

【Spring Boot 】@Componentがシングルトンであることの確認

Spring Bootの@Componentはシングルトンです。つまりインスタンスが1つしか存在しません。

@Componentだけでなく、@Controllerや@Serviceも同じです。

これを簡単なコードを書いてテストしてみました。

実験1

まずは、以下のようなコントローラークラスを実装します。

@RestController
public class DemoController {
  private int num;
  
  public DemoController() {
    num = 0;
  }

  @GetMapping("/")
  public String index() {
    num++;
    return String.format("%d回目のアクセスです。", num);
  }
}

このアプリケーションを立ち上げ、localhost:8080にアクセスをすると最初は

1回目のアクセスです。

と表示されますが、次回は

2回目のアクセスです。

と表示されます。

実験2

次に、先ほど使ったクラスを少しだけ書き換え、リクエストが来てから10秒後にレスポンスを返すようにしてみましょう。

コントローラークラスを以下のように書き換えます。

@RestController
public class DemoController {
  private int num;
  
  public DemoController() {
    num = 0;
  }

  @GetMapping("/")
  public String index() throws Exception {
    Thread.sleep(10 * 1000);
    num++;
    String date = new Date().toString();
    return String.format("%d回目のアクセスです。時間は%sです。", num, date);
  }
}

アプリケーションを立ち上げ、ブラウザで2つのタブを並べて同時に(手動なので少しずれますが)localhost:8080にアクセスしてみましょう。

1回目は

1回目のアクセスです。時間はFri Jul 24 09:33:07 JST 2020です。

2回目は

2回目のアクセスです。時間はFri Jul 24 09:33:17 JST 2020です。

と表示されます。

1回目のアクセスの直後に2回目のリクエストをしても、1回目のリクエストがコントローラークラスを10秒間使うため、2回目のリクエストが待たされていることがわかりますね。

Spring Bootを使う上では初歩的な内容ではありますが、実際に手を動かして確認してみました。