Сколько экземпляров бина со scope «singleton» может существовать в Spring?

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

Ответ

По умолчанию Spring создаёт ровно один экземпляр бина с областью видимости (scope) "singleton" в рамках одного контейнера ApplicationContext. Это самый распространённый scope.

Ключевые моменты:

  • Один контейнер — один бин:

    @Service // По умолчанию scope="singleton"
    public class UserService {
        // В рамках одного ApplicationContext будет создан только один экземпляр UserService
    }
  • Несколько контейнеров: Если в приложении создано несколько независимых контекстов (ApplicationContext), в каждом будет свой singleton-экземпляр этого бина.

  • Альтернативные области видимости:

    • prototype: Создаёт новый экземпляр при каждом запросе (через context.getBean() или инъекцию).
      @Scope("prototype")
      @Component
      public class PrototypeBean { ... }
    • request, session, application: Доступны в веб-приложениях (Spring MVC).
  • Потокобезопасность: Поскольку singleton-бин разделяется между всеми потоками, его состояние должно быть спроектировано как потокобезопасное (stateless или с надлежащей синхронизацией).

  • Lazy-инициализация: Singleton-бин по умолчанию создаётся при старте контекста. Аннотация @Lazy откладывает создание до первого обращения.