Какие области видимости (scopes) бинов существуют в Spring?

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

Ответ

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

Основные scopes:

Scope Описание Контекст
singleton (по умолчанию) Создается один экземпляр на IoC-контейнер. Все запросы возвращают один и тот же объект. Любой
prototype Создается новый экземпляр при каждом запросе бина из контейнера. Любой
request Один экземпляр на жизненный цикл одного HTTP-запроса. Web (Spring MVC)
session Один экземпляр на HTTP-сессию пользователя. Web (Spring MVC)
application Один экземпляр на жизненный цикл ServletContext. Аналогичен singleton, но привязан к web-контексту. Web (Spring MVC)
websocket Один экземпляр на жизненный цикл WebSocket-сессии. Web (WebSocket)

Способы указания scope:

  1. Аннотация @Scope:

    @Component
    @Scope("prototype") // или @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public class MyPrototypeBean {}
  2. Специализированные аннотации (для web-контекста):

    @Component
    @RequestScope // Эквивалентно @Scope("request")
    public class MyRequestScopedBean {}

    Также доступны @SessionScope и @ApplicationScope.

  3. В XML-конфигурации:

    <bean id="myBean" class="com.example.MyBean" scope="prototype"/>

Почему это важно:

  • singleton используется для stateless-сервисов, репозиториев, утилитных классов (эффективно по памяти).
  • prototype нужен для stateful-бинов, состояние которых уникально для каждого использования (например, объект корзины покупок в момент создания).
  • Web-скопы (request, session) обеспечивают изоляцию данных между разными пользователями и запросами.