在Spring Boot中具有相同实现的多个bean

时间:2018-11-14 02:17:02

标签: java spring-boot javabeans

我遇到一种情况,我正在为特定的bean使用一种可能的实现,看起来像这样:

@Configuration
public class MyConfig {

    @Autowired
    private ApplicationContext context;

    @Bean
    public SomeInterface someInterface() {
        if (this.context.getEnvironment().getProperty("implementation") != null) {
            return new ImplementationOne();
        } else {
            return new ImplementationTwo();
        }
    }
}

到目前为止,这很好用,直到提出了新要求,才使用附加接口,该接口目前仅ImplementationTwo提供实现,并且与ImplementationOne一起使用是没有意义的:

    @Bean
    public SomeOtherInterface someOtherInterface() {
            return new ImplementationTwo();
    }

我想这会起作用,但是我想知道这是否真的有意义,因为在一种情况下,我可以让两个bean基本上实例化同一个对象。那有意义吗 ?也许有更好的方法可以实现相同的目的?

2 个答案:

答案 0 :(得分:0)

我相信,如果您有一个接口的多个实现,那么应该使用以下特定的bean名称。

在这里,implementation1将是在我们具有Interface1依赖项的任何地方创建和注入的主要bean。

@Primary
@Bean
public Interface1 implementation1() {
    return new Implementation2();
}

@Bean
public Interface1 implementation2() {
    return new Implementation2();
}

如果需要注入Implementation2,则需要使用@Resource注释,如下所示。

@Resource(name="implementation2")
Interface1 implementation2;

答案 1 :(得分:0)

您始终可以在使用特定bean的每个地方定义一个限定词:

   @Bean
   public SomeInterface beanName1(){ //impl }

   @Bean
   public SomeInterface beanName2(){ //impl }

用法:

 @Qualifier("beanName1") SomeInterface interface;

还需要在您的application.yml/properties文件中允许多个bean:

spring.main.allow-bean-definition-overriding=true