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

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

Ответ

Нет, Spring не управляет полным жизненным циклом prototype-бина. Управление ограничивается фазами создания и настройки.

Жизненный цикл prototype-бина в Spring:

  1. Создание (Instantiation): Новый экземпляр создается при каждом запросе (через ApplicationContext.getBean() или инъекцию зависимости).
  2. Настройка (Population & Initialization): Spring внедряет зависимости и вызывает метод, помеченный аннотацией @PostConstruct.
  3. Уничтожение (Destruction): Spring НЕ вызывает метод @PreDestroy для prototype-бинов. Очистка ресурсов (закрытие соединений, файлов) и удаление из памяти — ответственность клиентского кода и JVM (сборщика мусора).

Почему так? Область prototype подразумевает, что Spring возвращает управление объектом клиенту сразу после его создания и настройки. Контейнер не отслеживает дальнейшую судьбу этих экземпляров.

Пример:

@Component
@Scope("prototype")
public class PrototypeService {
    @PostConstruct
    public void init() {
        System.out.println("Prototype bean created and initialized.");
    }
    @PreDestroy
    public void cleanup() {
        // ЭТОТ МЕТОД НИКОГДА НЕ ВЫЗОВЕТСЯ SPRING'OM!
        System.out.println("Это сообщение не появится.");
    }
}

Для корректного освобождения ресурсов prototype-бинов необходимо использовать шаблоны вроде DisposableBean с явным вызовом метода уничтожения в клиентском коде.