In Spring Framework unable to properly implement Qualifier Annotation

Viewed 25

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

1 Answers

The proper syntax is -

    @Autowired
    public Desert(@Qualifier("cake")ISugar sugar) {
        this.sugar = sugar;
    }
Related