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を使う上では初歩的な内容ではありますが、実際に手を動かして確認してみました。