Ответ
Метод, аннотированный @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.