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 — это нормально и безопасно по умолчанию, даже при множестве одновременных запросов: бины обычно не хранят изменяемое состояние между запросами (вся нужная информация передаётся как параметры методов) — поэтому один общий объект сервиса безопасно обслуживает все запросы параллельно, не создавая гонки данных.
• зачем нужен `@Qualifier` и что произойдёт без него при конфликте бинов (если дошёл до 2-го слоя).