如何在 Spring Context 中创建两个相同类的 bean?

问题描述 投票:0回答:3

我可以使用@Bean注释在Spring中声明一个bean。假设我在应用程序上下文中声明了两个 String 类型的 bean。

@Bean
public String country(){ return "India";}

@Bean
public String continent(){ return "Asia";}

在这种情况下,当 Spring 容器引导时会发生什么?会不会有什么错误?

java spring spring-boot spring-bean
3个回答
3
投票

您可以在同一上下文中拥有相同类型的 Bean。两个 bean 将具有源自方法名称的不同名称(

country
continent
):

@Configuration
public class Config {
    @Bean
    public String country() {
        return "Germany";
    }
    @Bean
    public String continent() {
        return "Europe";
    }
}

因此您可以按名称连接豆子:

@Autowired
String country;

@Autowired
String continent;

如果需要,您还可以显式定义名称:

@Bean(name = "myContinent")
public String continent() {
    return "Europe";
}

然后使用

@Qualifier
进行接线:

@Qualifier("myContinent")
@Autowired
String continent;

0
投票

您可以在 multibeanconfig

的帮助下完成此操作

首先添加依赖

<dependency>
   <groupId>io.github.olufemithompson</groupId>
   <artifactId>multibeanconfig</artifactId>
   <version>0.0.3</version>
</dependency>

然后注释您想要使用其 csonfig 参数创建多个版本的类,例如

@MultiBean
public class HttpClientService {

  @Value("${config.client-id}")
  private  String clientId;

  @Value("${config.client-secret}")
  private  String clientSecret;

}

然后添加将在 application.yml 中创建的不同 bean 的配置:

multibean:
  default-client:
    class: HttpClientService
    config:
      client-id: 'id-1'
      client-secret: 'secret-1'

  fail-over-client:
    class: HttpClientService
    config:
      client-id: 'id-2'
      client-secret: 'secret-2'

这会自动允许您注册具有不同配置的同一类的两个不同 bean。

图书馆为此提供了一种更简洁的方法。您还可以查看这篇medium post,其中讨论了该库的更多功能


-3
投票

可以在同一上下文中创建两个 spring bean。但它们需要在单独的 @Configuration 文件中创建并单独访问。

© www.soinside.com 2019 - 2024. All rights reserved.