Ответ
Нет, метод @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!"); // Не вызовется
}
}
Альтернативы для освобождения ресурсов:
- Реализовать интерфейс
DisposableBean(не рекомендуется из-за связывания с Spring API). - Использовать кастомный метод уничтожения в
@Beanопределении:@Bean(destroyMethod="myCleanup"). - Вызывать метод очистки явно в клиентском коде, когда работа с бином завершена.
- Использовать шаблон «callback»: определить собственный интерфейс очистки, который клиент будет вызывать.