Вызывается ли метод с аннотацией @PreDestroy у бинов с областью видимости prototype в Spring?

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

Ответ

Нет, метод @PreDestroy не вызывается Spring-контейнером для бинов с областью видимости prototype.

Причина: Spring управляет полным жизненным циклом только для singleton бинов. Для бинов prototype контейнер отвечает только за их создание и инициализацию (вызов @PostConstruct), после чего передаёт экземпляр клиенту. Уничтожение prototype бина и освобождение его ресурсов — это ответственность клиентского кода.

Пример:

@Component
@Scope("prototype")
public class PrototypeBean {
    @PostConstruct
    public void init() {
        System.out.println("Prototype bean initialized."); // Вызовется
    }

    @PreDestroy
    public void cleanup() {
        System.out.println("This will NOT be called by Spring!"); // Не вызовется
    }
}

Альтернативы для освобождения ресурсов:

  1. Реализовать интерфейс DisposableBean (не рекомендуется из-за связывания с Spring API).
  2. Использовать кастомный метод уничтожения в @Bean определении: @Bean(destroyMethod="myCleanup").
  3. Вызывать метод очистки явно в клиентском коде, когда работа с бином завершена.
  4. Использовать шаблон «callback»: определить собственный интерфейс очистки, который клиент будет вызывать.