Для чего используется аннотация @PreDestroy в Spring?

«Для чего используется аннотация @PreDestroy в Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

@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.