Ответ
@PreDestroy — это аннотация из спецификации Java/Jakarta EE, которую Spring также поддерживает. Она помечает метод, который должен быть выполнен контейнером непосредственно перед уничтожением бина (например, при закрытии контекста приложения).
Основное назначение: освобождение ресурсов (закрытие соединений, остановка потоков, очистка кэшей).
Пример:
import jakarta.annotation.PreDestroy;
@Component
public class DatabaseConnectionPool {
private List<Connection> connections;
// ... инициализация пула
@PreDestroy
public void destroy() {
System.out.println("Shutting down connection pool...");
for (Connection conn : connections) {
try { conn.close(); } catch (SQLException ignored) {}
}
}
}
Важные детали:
- Метод должен быть
voidи не принимать параметров. - Вызов не гарантирован при аварийном завершении JVM (например,
kill -9). - В Spring является альтернативой:
- Реализации интерфейса
DisposableBean. - Указания метода в
@Bean(destroyMethod = "..."). - Объявления метода с именем
destroy()илиclose()для бинов, реализующихAutoCloseable.
- Реализации интерфейса