В Spring, стоит ли по умолчанию использовать Scope Singleton?

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

Ответ

Да, в большинстве случаев @Scope("singleton") (или его эквивалент, например, @Service) является хорошим выбором по умолчанию.

Преимущества Singleton Scope:

  • Эффективность: Создается и внедряется один экземпляр бина на весь контекст приложения, что экономит память и время на инициализацию.
  • Идеален для stateless-сервисов: Например, для сервисов бизнес-логики, утилитных классов или репозиториев, которые не хранят состояние конкретного запроса.

Когда Singleton НЕ подходит:

  • Stateful-компоненты: Если бин должен хранить состояние, специфичное для запроса (@RequestScope) или сессии (@SessionScope).
  • Проблемы с потокобезопасностью: Singleton-бин должен быть спроектирован как потокобезопасный, если к его состоянию возможен параллельный доступ.
  • Особые случаи: Для бинов с дорогой инициализацией, которые используются редко, можно рассмотреть @Scope("prototype").

Пример stateless Singleton-сервиса:

@Service // По умолчанию Scope = "singleton"
public class TaxCalculatorService {
    // Stateless метод - безопасен для Singleton
    public BigDecimal calculateVAT(BigDecimal amount) {
        return amount.multiply(new BigDecimal("0.20"));
    }
}

Выбор скоупа должен быть осознанным и основываться на жизненном цикле и состоянии компонента.