I have an interface -
ISugar.java -
public interface ISugar {
public void addSugar();
}
I have two classes implementing the interface -
IceCream.java -
@Component
public class IceCream implements ISugar {
@Override
public void addSugar() {
System.out.println("Sugar added to icecream");
}
}
Cake.java -
@Component
public class Cake implements ISugar {
@Override
public void addSugar() {
System.out.println("Sugar added to cake");
}
}
Now I have interface -
IDesert.java -
public interface IDesert {
public void addSugar();
public void eatDesert();
}
And I have a class implementing the interface -
Desert.java -
@Component
public class Desert implements IDesert {
private ISugar sugar;
@Autowired
public Desert(ISugar sugar) {
this.sugar = sugar;
}
@Override
public void addSugar() {
sugar.addSugar();
}
@Override
public void eatDesert() {
System.out.println("Eating desert");
}
}
I have a xml file -
applicationContext.xml
<context:component-scan base-package="com.ghostcoder.springdemo"/>
and my main method is -
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
IDesert desert = context.getBean("desert", IDesert.class);
desert.addSugar();
desert.eatDesert();
context.close();
Now, since ISugar interface is implemented by two classes - IceCream and Cake there is ambiguity and as such error as expected -
NoUniqueBeanDefinitionException
expected single matching bean but found 2: cake,iceCream
Now, I know the solution is to use Qualifier Annotation -
ex -
Qualifier("iceCream")
but I am unsure about where to place the Qualifier Annotation in class - Desert I have tried to put it above constructor but without success