はじめに
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 してくれる
例
@Component
public class SampleService { }@Component を付けるだけで、
Spring が自動でインスタンスを作ります。
依存注入(@Autowired)
Bean が生成されたら、
次に 依存関係が注入されます。
@Service
public class UserService {
private final UserRepository repository;
public UserService(UserRepository repository) {
this.repository = repository;
}
}- コンストラクタ
- フィールド
- セッター
いずれかの方法で依存が注入されます。
初期化(@PostConstruct)
Bean が生成され、依存注入が終わった後に
初期化処理 が実行されます。
例
@PostConstruct
public void init() {
System.out.println("初期化処理");
}どんなときに使う?
- キャッシュの読み込み
- 設定値のチェック
- 外部サービスとの接続準備
利用(アプリ稼働中)
このフェーズが最も長く、
アプリが動いている間ずっと Bean は利用されます。
Singleton の場合は
アプリ終了まで同じインスタンスが使われ続けます。
破棄(@PreDestroy)
アプリ終了時、
Bean は破棄される前に 終了処理 を実行できます。
例
@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 の一生を全部管理してくれる」
と理解できれば十分です。

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

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

コメント