Как устранить неоднозначности в АВТОМАТИЧЕСКОМ СОЕДИНЕНИИ бобов весной?
У нас есть интерфейс Dessert, и у нас есть три различных десерта (Beans), которые реализуют интерфейс (Dessert).
Десерт дня - Печенье, поэтому мы записали его как любимое с @Primary
.
Проблема в том, что десерты были сделаны просто, и если кто-то захочет повторить десерт, больше не будет печенья, поэтому мы создали "repeatDessert" для тех, кто хочет повторить десерт.
В дополнение к любимому десерту, есть еще два десерта, ТОРТ И МОРОЖЕНОЕ.
Мы хотим, чтобы всем, кто повторяется, был подан десерт IceCream, которого у нас достаточно.
Как мы можем сказать Спрингу, какой из двух десертов мы хотим, чтобы он служил?
public interface Dessert {
void eat();
}
ТОРТОВЫЙ ТОРТ:
@Component
public class Cake implements Dessert{
private Dessert repeatDessert;
public Dessert getRepeatDessert() {
return repeatDessert;
}
@Autowired
public void setRepeatDessert(Dessert repeatDessert) {
this.repeatDessert = repeatDessert;
}
@Override
public void eat() {
System.out.println("Eating a Cake !!!!");
}
}
БИО КУКИ:
@Component
@Primary
public class Cookie implements Dessert{
private Dessert repeatDessert;
public Dessert getRepeatDessert() {
return repeatDessert;
}
@Autowired
public void setRepeatDessert(Dessert repeatDessert) {
this.repeatDessert = repeatDessert;
}
@Override
public void eat() {
System.out.println("Eating a Cookie !!!!");
}
}
Бобовое мороженое:
@Component
public class IceCream implements Dessert{
private Dessert repeatDessert;
public Dessert getRepeatDessert() {
return repeatDessert;
}
@Autowired
public void setRepeatDessert(Dessert repeatDessert) {
this.repeatDessert = repeatDessert;
}
@Override
public void eat() {
System.out.println("Eating a IceCream !!!!");
}
}
Это будет файл конфигурации:
@Configuration
@ComponentScan
public class AutoBeanConfiguration {
}
Это будет основной класс:
public class Main {
public static void main(String[] args) {
BasicConfigurator.configure();
Logger.getRootLogger().setLevel(Level.ERROR);
AnnotationConfigApplicationContext ctxt = new AnnotationConfigApplicationContext(AutoBeanConfiguration.class);
Cookies cookies = ctxt.getBean(Cookies.class);
cookies.eat();
Dessert dessert = cookies.getRepeatDessert();
dessert.eat();
ctxt.close();
}
}
Программа выдает следующее exception
:
Exception in thread "main" Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cookies': Unsatisfied dependency expressed through method 'setRepeatDessert' parameter 0;
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'Dessert' available: expected single matching bean but found 2: cake,iceCream
Как мы можем устранить неоднозначность и сказать весне, какой из десертов мы хотим создать, когда хотим повторить?
Вывод на консоль должен быть таким:
Eating a Cookies !!!!
Eating a IceCream !!!!