我可以使用@Bean注释在Spring中声明一个bean。假设我在应用程序上下文中声明了两个 String 类型的 bean。
@Bean
public String country(){ return "India";}
@Bean
public String continent(){ return "Asia";}
在这种情况下,当 Spring 容器引导时会发生什么?会不会有什么错误?
您可以在同一上下文中拥有相同类型的 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;
您可以在 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,其中讨论了该库的更多功能
可以在同一上下文中创建两个 spring bean。但它们需要在单独的 @Configuration 文件中创建并单独访问。