Карта / Spring Core / Scope, @Qualifier

Scope, @Qualifier

Scope (область видимости бина) определяет, сколько объектов создаст Spring и как долго они живут.

@Service
@Scope("singleton")   // по умолчанию — один объект на всё приложение
class UserService { ... }

@Component
@Scope("prototype")   // новый объект на каждый запрос внедрения
class ReportGenerator { ... }

singleton — один экземпляр на всё приложение (по умолчанию, не нужно указывать явно). prototype — новый объект каждый раз, когда его внедряют куда-то.

@Qualifier — решает конфликт, когда подходящих бинов несколько:

interface PaymentService { void pay(); }

@Service("cardPayment")
class CardPaymentService implements PaymentService { ... }
@Service("paypalPayment")
class PaypalPaymentService implements PaymentService { ... }

@Service
class OrderService {
    OrderService(@Qualifier("cardPayment") PaymentService payment) { ... }   // явно указали, какой
}
Копнуть глубже

Без @Qualifier Spring не может выбрать, если есть два бина одного типа — упадёт с ошибкой NoUniqueBeanDefinitionException ещё на старте приложения (это хорошо — лучше явная ошибка при запуске, чем непредсказуемое поведение в рантайме).

Другие виды Scope, кроме singleton/prototype, актуальны для веб-приложений:

  • request — новый бин на каждый HTTP-запрос;
  • session — новый бин на каждую HTTP-сессию пользователя.

Почему singleton — это нормально и безопасно по умолчанию, даже при множестве одновременных запросов: бины обычно не хранят изменяемое состояние между запросами (вся нужная информация передаётся как параметры методов) — поэтому один общий объект сервиса безопасно обслуживает все запросы параллельно, не создавая гонки данных.

🎤 Закрыл тему, если можешь объяснить:
• разницу singleton и prototype scope;
• зачем нужен `@Qualifier` и что произойдёт без него при конфликте бинов (если дошёл до 2-го слоя).