Существует ли scope ‘application’ в Spring?

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

Ответ

Да, scope application существует в Spring, но он специфичен для веб-приложений и не является одним из пяти стандартных scopes для обычных бинов.

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

  • Контекст: Доступен только в веб-приложениях Spring (WebApplicationContext).
  • Жизненный цикл: Бин создается один раз на все приложение и привязывается к ServletContext.
  • Видимость: Доступен для всех HTTP-запросов и сессий в рамках одного веб-приложения, аналогично singleton, но с привязкой к ServletContext.

Основные scopes в Spring:

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

Пример объявления:

@Component
@Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ApplicationScopedBean {
    // ...
}

Или с использованием аннотации @ApplicationScope (начиная с Spring 4.3):

@Component
@ApplicationScope
public class ApplicationScopedBean {
    // ...
}

Почему это важно: Используйте application scope для данных, общих для всего приложения (например, кэш конфигурации, общие ресурсы), которые должны переживать перезапуск контейнера бинов, но быть привязанными к жизненному циклу веб-приложения.