вариант холодно
Мастер
(1218)
5 месяцев назад
Если в Spring-контексте определено несколько бинов, которые реализуют один и тот же интерфейс, то при обращении к этому интерфейсу можно использовать аннотации `@Qualifier` или `@Primary`, чтобы указать, какой именно бин должен быть использован.
Аннотация `@Qualifier` позволяет указать конкретное имя бина, которое определено в контексте:
public interface MyInterface {}
@Component("MyFirstImplementation")
public class MyFirstImplementation {}
@Component("MySecondImplementation")
public class MySecondImplementation {}
@Service
public class MyService {
@Autowired
@Qualifier("MyFirstImplementation")
private MyInterface myInterface;
}
В данном примере мы определяем две реализации интерфейса `MyInterface` - `MyFirstImplementation` и `MySecondImplementation`. Затем, при инъекции бина в сервис `MyService`, мы используем аннотацию `@Qualifier`, чтобы указать, что нам нужен именно бин с именем `"MyFirstImplementation"`.
Аннотация `@Primary` позволяет указать один основной бин, который будет использован по умолчанию:
public interface MyInterface {}
@Component
@Primary
public class MyFirstImplementation {}
@Component
public class MySecondImplementation {}
@Service
public class MyService {
@Autowired
private MyInterface myInterface;
}
В данном примере мы определяем две реализации интерфейса `MyInterface` - `MyFirstImplementation` и `MySecondImplementation`. Однако, мы также указываем аннотацию `@Primary` для `MyFirstImplementation`, что делает его основным бином для этого интерфейса. При инъекции бина в сервис `MyService`, мы не указываем конкретное имя бина, поэтому будет использован `MyFirstImplementation` как основной бин.