MicronautのBeanライフサイクルとは?生成から破棄までの流れを初心者向けに徹底解説
生徒
「MicronautのBeanって、いつ作られて、いつ消えるんですか?」
先生
「Micronautでは、Beanには決まったライフサイクルがあります。生成から破棄までの流れを理解すると、DIの動きが分かりやすくなります。」
生徒
「Springみたいに勝手に管理されている感じですか?」
先生
「似ていますが、Micronautはコンパイル時に多くの処理を済ませるので、流れがとてもシンプルです。」
生徒
「初心者でも理解できますか?」
先生
「段階ごとに見ていけば大丈夫です。まずはBeanがどのように生まれるのかから見ていきましょう。」
1. MicronautにおけるBeanとは何か
MicronautにおけるBeanとは、DIコンテナによって管理されるオブジェクトのことです。 Javaのクラスに特定のアノテーションを付けることで、そのクラスはBeanとして登録されます。 開発者が自分でnewを使って生成するのではなく、フレームワークが生成と管理を担当します。
Beanを使うことで、クラス同士の依存関係が整理され、コードの見通しが良くなります。 Micronautでは、このBean管理が軽量かつ高速に行われる点が大きな特徴です。
2. Beanライフサイクル全体の流れ
Beanライフサイクルとは、Beanが生成されてから破棄されるまでの一連の流れを指します。 Micronautでは、主に生成、依存性注入、初期化、利用、破棄という段階に分かれます。 それぞれの段階で、フレームワークが自動的に処理を行います。
この流れを理解することで、どのタイミングで処理を書けばよいのかが明確になります。 初心者にとっては、Beanが常に生き続けているわけではないという点を意識することが大切です。
3. Beanの生成タイミング
Micronautでは、Beanの生成タイミングはスコープによって異なります。 最もよく使われるSingletonの場合、アプリケーション起動時に生成されることが一般的です。 ただし、必要になるまで生成されない遅延生成もサポートされています。
import jakarta.inject.Singleton;
@Singleton
public class UserService {
public UserService() {
System.out.println("UserServiceが生成されました");
}
}
このクラスは、DIコンテナが起動する際に生成されます。 開発者が意識しなくても、Micronautが自動的に管理します。
4. 依存性注入が行われる流れ
Beanが生成されると、次に依存性注入が行われます。 これは、そのBeanが必要とする他のBeanを自動的に設定する処理です。 コンストラクタやフィールドに指定された依存関係が解決されます。
import jakarta.inject.Singleton;
@Singleton
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
}
この例では、UserControllerが生成される際にUserServiceが注入されます。 依存関係はコンパイル時に解析されているため、実行時の負荷が少なくなります。
5. 初期化処理のタイミング
依存性注入が完了すると、Beanは初期化段階に入ります。 初期化処理とは、Beanが利用可能になる前に一度だけ実行したい処理のことです。 設定値の確認やリソースの準備などが代表的な例です。
import jakarta.annotation.PostConstruct;
import jakarta.inject.Singleton;
@Singleton
public class InitSample {
@PostConstruct
public void setup() {
System.out.println("初期化処理が実行されました");
}
}
PostConstructを使うことで、Beanが完全に準備された後に処理を実行できます。 このタイミングを理解しておくと、初期化コードの置き場所に迷わなくなります。
6. Beanの利用と管理
初期化が終わったBeanは、アプリケーション内で自由に利用されます。 同じSingleton Beanは複数のクラスから共有されます。 Micronautは、どこで使われているかを把握した上で管理を行います。
開発者はBeanの存在を意識しすぎる必要はありません。 必要な場所で依存性注入を指定するだけで、適切なインスタンスが提供されます。
7. Beanの破棄と終了処理
アプリケーションが終了すると、Beanは破棄されます。 破棄の際には、後片付けの処理を行うことができます。 データベース接続のクローズやリソース解放などが代表的な用途です。
import jakarta.annotation.PreDestroy;
import jakarta.inject.Singleton;
@Singleton
public class DestroySample {
@PreDestroy
public void cleanup() {
System.out.println("終了処理が実行されました");
}
}
PreDestroyを使うことで、Beanが破棄される直前に処理を実行できます。 ライフサイクルの最後を理解することで、安全なリソース管理が可能になります。
8. Beanライフサイクルを理解するメリット
Beanライフサイクルを理解すると、MicronautのDIがどのように動作しているかが明確になります。 生成、初期化、破棄のタイミングを意識することで、バグの少ない設計が可能になります。
初心者のうちは、Singleton Beanを中心に学習すると全体像をつかみやすくなります。 これを理解することが、Micronautでのアプリケーション開発の土台になります。