Как Spring управляет бинами с областью видимости prototype?

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

Ответ

Spring создает и инициализирует новый экземпляр бина при каждом запросе (например, через getBean() или инъекцию), но не управляет его полным жизненным циклом.

Ключевые отличия от singleton:

  • Создание: Новый экземпляр на каждый запрос.
  • Инициализация: Spring выполняет внедрение зависимостей и вызов методов обратного вызова (например, @PostConstruct).
  • Уничтожение: Spring НЕ вызывает методы уничтожения (например, @PreDestroy или DisposableBean.destroy()). Ответственность за очистку ресурсов лежит на клиентском коде.

Пример объявления:

@Component
@Scope("prototype")
public class PrototypeBean {
    // При каждом обращении к контексту будет создан новый объект
}

Когда использовать:

  • Для stateful-бинов, состояние которых уникально для каждого использования (например, обработка отдельного HTTP-запроса в не-web контексте).
  • Когда не использовать: Для stateless-компонентов из-за накладных расходов на постоянное создание объектов. Требует осторожности, если бин держит дорогие ресурсы (открытые соединения, файлы), так как их необходимо явно освобождать.