gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:15:33 26 4
gpt4 key购买 nike

我有以下代码

interface Drivable {

}

@Component
class Bmw implements Drivable {

}

@Component
class Mercedes implements Drivable {

}

class Driver {
private Drivable drivable;

public Driver(Drivable drivable) {
this.drivable = drivable;
}
}

和 Spring Java 配置

@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();
}
}

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

最佳答案

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

如果我们有多个符合 Spring 注入(inject)条件的 Bean,那么我们使用 @Qualifer 来指定需要使用哪一个进行注入(inject)。

在本例中,您有两个 bean BmwMercedes 都实现了 Drivable 接口(interface)。

假设我正确理解了您的意图,您希望 spring 将 Mercedes bean 注入(inject)到 Driver 对象中。

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

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

然后您可以使用 AnnotationConfigApplicationContext 加载 spring 上下文,并随后获取 Driver bean,如下所示:

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

为了扩展这个示例,假设您想为 BmwMercedes 分别创建一个 Driver bean,那么示例代码为:

@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);
}
}

关于spring - 在Java Config Spring中一起使用@Qualifier和@Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49127000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com