Какие типы контекстов существуют в Spring-приложении и какова их область видимости?

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

Ответ

В Spring-приложении существует несколько типов контекстов (scope), каждый со своей областью видимости и временем жизни.

Основные контексты (scopes) бинов Spring:

  1. singleton (по умолчанию): Один экземпляр бина на весь ApplicationContext. Используется для stateless-сервисов.
  2. prototype: Новый экземпляр бина при каждом запросе через контейнер.
  3. request: Один экземпляр на жизненный цикл одного HTTP-запроса. Доступен только в веб-приложениях.
  4. session: Один экземпляр на HTTP-сессию пользователя.
  5. application: Один экземпляр на ServletContext. Аналогичен singleton, но привязан к контексту веб-приложения.

Пример объявления бина с областью видимости request:

@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestScopedBean {
    private final String data = "Request-specific data";
    // ...
}

Важные связанные понятия:

  • ApplicationContext: Корневой контейнер Spring, обычно один на приложение, но могут быть иерархии (родительский/дочерний).
  • WebApplicationContext: Специализированный контекст для веб-приложений.
  • SecurityContext (Spring Security): Хранит информацию об аутентификации и правах текущего потока (привязан к ThreadLocal).

Выбор контекста определяет, как и когда создаются/уничтожаются бины, что критично для управления состоянием и ресурсами.