我遇到一种情况,我正在为特定的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基本上实例化同一个对象。那有意义吗 ?也许有更好的方法可以实现相同的目的?
答案 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