В чем разница между scope Singleton и Prototype в Spring?

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

Ответ

Singleton и Prototype — это основные области видимости (scope) бинов в Spring, определяющие жизненный цикл экземпляра.

Singleton (по умолчанию)

  • Контейнер создает только один экземпляр бина.
  • Все запросы (инъекции, вызовы getBean()) получают один и тот же объект.
  • Используется для stateless-компонентов: сервисы, репозитории, утилитные классы.
  • Потокобезопасность: Бин не должен хранить изменяемое состояние, иначе возможны состояния гонки (race condition).

Prototype

  • Контейнер создает новый экземпляр при каждом запросе.
  • Каждая инъекция или вызов getBean() возвращает новый объект.
  • Используется для stateful-компонентов: объекты с состоянием, специфичным для запроса (например, DTO, данные сессии пользователя).
  • Управление памятью: Контейнер Spring не управляет полным жизненным циклом prototype-бина после его создания и передачи клиенту. Уничтожение — ответственность клиентского кода.

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

// Singleton (явное указание избыточно, так как это scope по умолчанию)
@Component
@Scope("singleton") // или @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class OrderService { ... }

// Prototype
@Component
@Scope("prototype") // или @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ShoppingCart { ... }

Ключевой вывод: Выбор зависит от необходимости разделять состояние. Singleton — для общей логики, Prototype — для изолированных данных.