Почему в Spring scope по умолчанию — Singleton, а не Prototype?

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

Ответ

Singleton является scope по умолчанию в Spring, потому что он оптимален для подавляющего большинства компонентов enterprise-приложений.

Причины выбора Singleton по умолчанию:

  1. Производительность: Создание и инициализация одного экземпляра на весь контекст приложения экономит память и CPU-время.
  2. Stateless-модель: Большинство сервисов, репозиториев и контроллеров не хранят состояние, связанное с конкретным запросом или пользователем. Один экземпляр может безопасно использоваться всеми потоками.
  3. Соответствие паттернам: Многие классические паттерны (Factory, Strategy) также предполагают использование объектов-одиночек.

Когда использовать Prototype scope? Только когда бин должен быть stateful и его состояние уникально для каждого места инъекции или запроса.

@Component
@Scope("prototype") // Явное указание необходимо
public class ShoppingCart {
    private List<Item> items = new ArrayList<>();
    // У каждого покупателя должна быть своя корзина
}

Важно: Необоснованное использование prototype увеличивает нагрузку на сборщик мусора и может привести к утечкам памяти, если бины не спроектированы корректно. Spring не управляет полным жизненным циклом prototype-бинов после их создания и передачи клиенту.