はじめに
こんにちは! 今回は、Spring Frameworkでリソースの解放に便利な@PreDestroy
というアノテーションについてお話しします。
@PreDestroyって何?
@PreDestroyとは
「Beanが破棄される直前に実行されるメソッドに付けるアノテーション」 です。
たとえば、データベース接続のクローズや一時ファイルの削除など、アプリケーション終了前に必ず実行しておきたい処理を設定するのに役立ちます。
普段あまり意識しないかもしれませんが、実はアプリケーションの安全な終了にとても重要な役割を果たしています。
基本的な使い方
それでは、@PreDestroy
の基本的な使い方を見てみましょう。以下のコード例をご覧ください。
import javax.annotation.PreDestroy;
import org.springframework.stereotype.Component;
@Component
public class ResourceCleanupService {
@PreDestroy
public void cleanUp() {
System.out.println("リソースを解放しています...");
// ここにリソース解放の処理を書く
}
}
この例では、Springがアプリケーションを終了するときにcleanUp()
メソッドが自動的に呼び出されます。
例えば、サーバーを停止すると「リソースを解放しています…」というメッセージがコンソールに表示されます。
ポイント
@Component
としてBean登録されているクラス内のメソッドに@PreDestroy
を付けると、Springが自動的に実行します。- サーバーのシャットダウンやBeanのスコープ終了時に実行されます。
@PreDestroyの応用編
ここからは、@PreDestroy
のもう少し高度な使い方について見ていきましょう。 例えば、外部リソースの解放、スケジュールタスクの停止、キャッシュのクリアなど様々な用途で活用できます。
1. データベース接続のクローズ
import javax.annotation.PreDestroy;
import java.sql.Connection;
import java.sql.SQLException;
@Component
public class DatabaseService {
private Connection connection;
public DatabaseService() {
// データベース接続の初期化
this.connection = createConnection();
}
private Connection createConnection() {
// 実際の接続処理(例)
return null;
}
@PreDestroy
public void closeConnection() {
try {
if (connection != null && !connection.isClosed()) {
connection.close();
System.out.println("データベース接続をクローズしました");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
説明:
@PreDestroy
を使って、アプリケーション終了時にデータベース接続を確実にクローズ。- これにより、リソースリークを防ぎます。
2. スケジュールタスクの停止
import javax.annotation.PreDestroy;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTaskService {
private boolean isRunning = true;
@Scheduled(fixedRate = 5000)
public void executeTask() {
if (isRunning) {
System.out.println("タスクを実行中...");
}
}
@PreDestroy
public void stopTask() {
isRunning = false;
System.out.println("スケジュールタスクを停止しました");
}
}
説明:
@Scheduled
で定期的に実行されるタスクを、@PreDestroy
で安全に停止。- アプリケーション終了時にタスクが残らないようにするのがポイントです。
3. キャッシュのクリア
import javax.annotation.PreDestroy;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class CacheService {
private Map<String, Object> cache = new HashMap<>();
public void put(String key, Object value) {
cache.put(key, value);
}
public Object get(String key) {
return cache.get(key);
}
@PreDestroy
public void clearCache() {
cache.clear();
System.out.println("キャッシュをクリアしました");
}
}
説明:
@PreDestroy
でキャッシュをクリアし、メモリリークを防止。- アプリケーションのパフォーマンス向上に貢献します。
@PreDestroyの注意点
- 例外処理を忘れないこと:
@PreDestroy
のメソッド内で例外が発生すると、予期しない動作になる可能性があります。
そのため、適切な例外処理を行いましょう。 - @PreDestroyは一度しか呼ばれない:
Beanが破棄されるときに一度だけ呼ばれるため、繰り返し実行されるような処理には向いていません。 - Beanのスコープに依存:
@PreDestroy
は、シングルトンスコープやプロトタイプスコープのBeanで使用できますが、
スコープの設定により呼ばれるタイミングが異なることに注意が必要です。
@PreDestroyの使いどころ
1. リソースの解放
データベース接続やファイルハンドラなど、長期間使用されるリソースを解放するのに最適です。
2. セッション管理
ユーザーセッションの終了時にリソースを解放したり、セッション情報をログに残す処理などで使用。
3. 外部APIとの接続終了
外部システムへの接続が必要なアプリケーションで、シャットダウン前に接続を切断するのに役立ちます。
まとめ
今回は、Springの@PreDestroy
アノテーションについて詳しく解説しました。 アプリケーション終了前に実行したい処理がある場合、このアノテーションを活用することで、安全かつ効率的にリソースを管理できます。 特に、リソースのクリーンアップやセッション管理など、意外と見落としがちな処理にぜひ役立ててください!
もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。
他の記事が見たい方はこちら!↓↓↓