Будет ли вызван метод с аннотацией @PreDestroy у Spring-бина со scope prototype?

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

Ответ

Нет, не будет. Spring не управляет полным жизненным циклом бинов с областью видимости prototype.

Причина: Spring создает экземпляр prototype-бина, внедряет зависимости и передает его клиенту. Контейнер больше не отслеживает этот экземпляр и не вызывает методы его уничтожения.

Пример:

@Scope("prototype")
@Component
public class PrototypeBean {
    @PreDestroy
    public void cleanup() {
        // Этот метод никогда не будет вызван Spring-контейнером.
    }
}

Решение: Для ручного освобождения ресурсов prototype-бина используйте:

  • Шаблон DisposableBean (не рекомендуется из-за связывания с Spring API).
  • Явный вызов специального метода-очистки клиентским кодом.
  • Использование callback-метода, аннотированного @PreDestroy, в бине-клиенте, который управляет жизнью prototype-бина.