在Java Config Spring中一起使用@Qualifier和@Bean

And*_*kiy 2 spring

我有遵循代码

   interface Drivable{

}

@Component
class Bmw implements Drivable {

}

@Component
class Mercedes implements Drivable {

}

class Driver {
    private Drivable drivable;

    public Driver(Drivable drivable) {
        this.drivable = drivable;
    }
}
Run Code Online (Sandbox Code Playgroud)

和Spring Java Config

@Configuration
@ComponentScan
class CarConfig {
    @Bean
    @Qualifier("mercedes")//the code won't work
    public Driver getDriver(Drivable drivable) {
        return new Driver(drivable);
    }

    @Bean//I've added the bean
    public Drivable getMercedes() {
        return new Mercedes();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果要指定应传递给方法的对象类型,可以使用@Qualifier@Bean注释的注释吗?我在Spring doc中找不到如何解决问题的方法。谢谢。

Mad*_*apu 6

我认为您的用法@Qualifier有点错误。

如果我们有一个以上的豆可以进行春季注射,那么我们可以@Qualifer用来指定需要进行春季注射的豆。

在这种情况下,您有两个bean,Bmw并且Mercedes都实现了Drivable接口。

假设我的意图正确,您想让Spring将Mercedesbean注入Driver对象。

因此,您需要public Driver getDriver(@Qualifier("mercedes") Drivable drivable)CarConfig类中指定。

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

然后,您可以AnnotationConfigApplicationContext用来加载spring上下文,并随后Driver按以下方式获取bean:

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

只是为了扩展示例,让我们说一下是否要Driver为每个创建一个bean BmwMercedes然后示例代码将是:

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)