Сколько раз вызывается метод @PreDestroy в Spring?

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

Ответ

Метод, аннотированный @PreDestroy, вызывается ровно один раз перед уничтожением бина Spring.

Когда это происходит:

  • При корректном завершении работы приложения.
  • При закрытии контекста приложения (applicationContext.close()).
  • Для бинов с областью видимости prototype — когда контейнер не управляет их жизненным циклом полностью, и вызов @PreDestroy может не произойти автоматически (требуется ручное управление).

Пример (очистка ресурсов):

@Component
public class CacheProvider {
    private Map<String, Object> cache = new ConcurrentHashMap<>();

    @PreDestroy
    public void cleanup() {
        System.out.println("Очистка кэша...");
        cache.clear();
        // Закрытие сетевых соединений, потоков и т.д.
    }
}

Важные ограничения:

  • Метод должен быть void и не принимать параметров.
  • Вызов не гарантирован при аварийном завершении процесса JVM (например, kill -9).
  • Как и @PostConstruct, аннотация работает только для бинов, управляемых контейнером Spring.