Using @Qualifier and @Bean together in Java Config Spring

I think you got the usage of @Qualifier bit wrong.

If we have more than one bean that qualifies for spring injection, then we use @Qualifer to specify which needs to be used for injection.

In this case you have two beans Bmw and Mercedes both implementing Drivable interface.

Presuming I got your intent correct, you want spring to inject Mercedes bean into the Driver object.

So for that, you need to specify public Driver getDriver(@Qualifier("mercedes") Drivable drivable) in the CarConfig class.

@Configuration
@ComponentScan
class CarConfig {
    @Bean
    public Driver getDriver(@Qualifier("mercedes") Drivable drivable) {
        return new Driver(drivable);
    }

And then you can use AnnotationConfigApplicationContext to load the spring context and subsequently get the Driver bean as below:

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(CarConfig.class);
        Driver bean = ctx.getBean(Driver.class);
    }
}

Just to extend the example, let us say if you want to create a Driver bean for each of Bmw and Mercedes then the sample code would be:

@Configuration
@ComponentScan
class CarConfig {
    @Bean(name="mercedesDriver")
    public Driver getMercedesDriver(@Qualifier("mercedes") Drivable drivable) {
        return new Driver(drivable);
    }

    @Bean(name="bmwDriver")
    public Driver getBmwDriver(@Qualifier("bmw") Drivable drivable) {
        return new Driver(drivable);
    }

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(CarConfig.class);
        System.out.println(Arrays.asList(ctx.getBeanNamesForType(Driver.class)));
        Driver mercedesBean = ctx.getBean("mercedesDriver", Driver.class);
        Driver bmwBean = ctx.getBean("bmwDriver", Driver.class);
    }
}

Tags:

Spring