Какие области видимости (scopes) бинов вы знаете в Spring Framework?

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

Ответ

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

Стандартные scopes:

  1. singleton (по умолчанию) — контейнер создает единственный экземпляр бина, и все запросы возвращают этот же объект.
  2. prototype — контейнер возвращает новый экземпляр при каждом запросе бина (через getBean() или инъекцию).
  3. request — один экземпляр на жизненный цикл одного HTTP-запроса (только для веб-приложений).
  4. session — один экземпляр на HTTP-сессию пользователя (только для веб-приложений).
  5. application — один экземпляр на жизненный цикл ServletContext (только для веб-приложений).
  6. websocket — один экземпляр на жизненный цикл WebSocket-сессии.

Как задать scope:

@Component
@Scope("prototype") // или @Scope(value = WebApplicationContext.SCOPE_REQUEST)
public class MyPrototypeBean { ... }
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public MyService myService() {
    return new MyService();
}

Важно: Scopes singleton и prototype доступны всегда. Остальные (request, session, application, websocket) — только в веб-приложениях. Для создания кастомного scope необходимо реализовать интерфейс org.springframework.beans.factory.config.Scope.