Что делает аннотация @Scope в Spring?

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

Ответ

Аннотация @Scope определяет область видимости (scope) бина в Spring, то есть его жизненный цикл и правила создания экземпляров.

Основные значения scope:

  • singleton (по умолчанию): Создается один экземпляр на весь контекст приложения. Все запросы к этому бину получают один и тот же объект.
  • prototype: При каждом запросе (инъекции или вызове getBean()) создается новый экземпляр.
  • request: Создается один экземпляр на один HTTP-запрос (только для веб-приложений).
  • session: Создается один экземпляр на HTTP-сессию пользователя (только для веб-приложений).
  • application: Создается один экземпляр на жизненный цикл ServletContext (только для веб-приложений).

Пример использования:

@Component
@Scope("prototype") // или @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ShoppingCart {
    // Для каждого нового покупателя будет создан новый экземпляр корзины
}

Важное замечание: Для scope, отличных от singleton (например, prototype), Spring не управляет полным жизненным циклом бина. Контейнер создает, настраивает и собирает бин, но не вызывает метод @PreDestroy. Управление ресурсами и очисткой для таких бинов ложится на клиентский код.