Что означает область видимости (scope) бина в Spring?

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

Ответ

Область видимости (scope) бина в Spring определяет жизненный цикл и контекст, в котором существует единственный экземпляр этого бина. Это управляет тем, как и когда Spring создает, использует и уничтожает бин.

Основные scope (из коробки):

  1. singleton (по умолчанию): Создается один экземпляр на весь IoC-контейнер. Все запросы к этому бину получают один и тот же объект.
    @Component
    @Scope("singleton") // Аннотация избыточна, так как это scope по умолчанию
    public class SingletonService { ... }
  2. prototype: Каждый запрос к контейнеру (через getBean() или инъекцию) возвращает новый экземпляр.
    @Component
    @Scope("prototype")
    public class PrototypeProcessor { ... }
  3. request: Один экземпляр на жизненный цикл одного HTTP-запроса (только для веб-приложений).
  4. session: Один экземпляр на HTTP-сессию пользователя (только для веб-приложений).
  5. application: Один экземпляр на ServletContext (аналогично singleton, но в контексте веб-приложения).
  6. websocket: Один экземпляр на жизненный цикл WebSocket-сессии.

Почему это важно? Выбор scope влияет на:

  • Потребление памяти (singleton экономит память, prototype может ее расходовать).
  • Потокобезопасность: Singleton-бины должны быть спроектированы как потокобезопасные, prototype-бины по своей природе изолированы для каждого потока/запроса.
  • Внедрение зависимостей: Внедрение prototype-бина в singleton требует особого подхода (например, через @Lookup или ObjectFactory), чтобы избежать "застревания" одного экземпляра prototype в singleton.