【Spring Boot】Bean のライフサイクルをやさしく解説

Java入門・実践
スポンサーリンク
スポンサーリンク

はじめに

Spring Boot を使っていると、
Bean(DI コンテナが管理するオブジェクト)
いつ作られ、いつ初期化され、いつ破棄されるのか
気になることがあります。

  • Bean はいつ生成される?
  • @PostConstruct はいつ呼ばれる?
  • @PreDestroy はどのタイミング?
  • Singleton と Prototype の違いは?

こういった疑問は、
Bean のライフサイクル
を理解するとスッと解決します。

この記事では、Bean のライフサイクルを
やさしく・実務寄り で整理していきます。


Bean のライフサイクルとは

一言でいうと、

「Spring が Bean を生成してから破棄するまでの一連の流れ」

です。

Spring が

  • 生成
  • 依存注入
  • 初期化
  • 利用
  • 破棄

までをすべて管理してくれます。


Bean のライフサイクルの全体像

1. インスタンス生成(new)
2. 依存注入(@Autowired)
3. 初期化(@PostConstruct)
4. 利用(アプリ稼働中)
5. 破棄(@PreDestroy)

この流れを理解すると、
Spring の“魔法”が現実的に見えてきます。

インスタンス生成(new)

どのタイミングで生成される?

Singleton(デフォルト) の場合:

  • アプリ起動時にすべての Bean が生成される
  • DI コンテナが new してくれる

Java
@Component
public class SampleService { }

@Component を付けるだけで、
Spring が自動でインスタンスを作ります。

依存注入(@Autowired)

Bean が生成されたら、
次に 依存関係が注入されます。

Java
@Service
public class UserService {

    private final UserRepository repository;

    public UserService(UserRepository repository) {
        this.repository = repository;
    }
}
  • コンストラクタ
  • フィールド
  • セッター

いずれかの方法で依存が注入されます。

初期化(@PostConstruct)

Bean が生成され、依存注入が終わった後に
初期化処理 が実行されます。

Java
@PostConstruct
public void init() {
    System.out.println("初期化処理");
}

どんなときに使う?

  • キャッシュの読み込み
  • 設定値のチェック
  • 外部サービスとの接続準備

利用(アプリ稼働中)

このフェーズが最も長く、
アプリが動いている間ずっと Bean は利用されます。

Singleton の場合は
アプリ終了まで同じインスタンスが使われ続けます。

破棄(@PreDestroy)

アプリ終了時、
Bean は破棄される前に 終了処理 を実行できます。

Java
@PreDestroy
public void destroy() {
    System.out.println("終了処理");
}

どんなときに使う?

  • 外部接続のクローズ
  • リソースの解放
  • キャッシュの書き戻し

Bean のスコープによる違い

Singleton(デフォルト)

  • アプリ起動時に 1 回だけ生成
  • 全体で共有
  • 最も一般的

Prototype

  • 呼び出されるたびに新しいインスタンス
  • 初期化はされるが、破棄は管理されない

Request / Session(Web アプリ)

  • リクエストごと / セッションごとに生成

ライフサイクルを理解すると解決できる疑問

なぜ @PostConstruct が呼ばれない?

→ Bean が管理対象外(@Component が付いていない)

なぜ @PreDestroy が呼ばれない?

→ Prototype スコープだから

なぜ値を変えただけで動作が変わる?

→ Singleton で同じインスタンスが使われ続けている

なぜ依存が注入されない?

→ ライフサイクルの順序を理解していないと気づけない


実務でよくある Bean の初期化・終了処理

初期化

  • 設定ファイルの読み込み
  • 外部 API のトークン取得
  • キャッシュの準備

終了処理

  • DB コネクションのクローズ
  • メッセージキューの切断
  • ログの書き出し

Bean のライフサイクルをもっと活かすポイント]

@PostConstruct で初期化をまとめる

コンストラクタでは依存注入が終わっていないため、
初期化は @PostConstruct が最適。

@PreDestroy でリソース解放

アプリ終了時の後処理を安全に実行できる。

スコープを意識する

Singleton と Prototype の違いを理解すると、
予期せぬ動作を防げます。


まとめ

Bean のライフサイクルは、

「生成 → 依存注入 → 初期化 → 利用 → 破棄」

という流れで進みます。

  • @PostConstruct → 初期化
  • @PreDestroy → 終了処理
  • Singleton → 起動時に 1 回だけ生成
  • Prototype → 呼び出すたびに生成
  • 永続化コンテキストとは別の概念

難しく聞こえますが、
「Spring が Bean の一生を全部管理してくれる」
と理解できれば十分です。


decopon
decopon

Bean のライフサイクルを理解すると、
Spring の“裏側の動き”が一気にクリアになります。
初期化・終了処理を正しく書けるだけで、
アプリの安定性がぐっと上がります。
あなたの開発が、今日より少しだけ楽になりますように。

moco
moco

Bean にも“生まれて、働いて、終わる”流れがあるんだね…
なんだかかわいいね。

コメント

タイトルとURLをコピーしました