【发布时间】:2019-11-15 13:03:53
【问题描述】:
我有一个这样定义的 Spring 组件:
@Component
public class SearchIndexImpl implements SearchIndex {
IndexUpdater indexUpdater;
@Autowired
public SearchIndexImpl(final IndexUpdater indexUpdater) {
Preconditions.checkNotNull(indexUpdater);
this.indexUpdater = indexUpdater;
}
}
以及IndexUpdater 接口的两个实现,例如:
@Component
public class IndexDirectUpdater implements IndexUpdater, DisposableBean, InitializingBean {
}
@Component
public class IndexQueueUpdater implements IndexUpdater, DisposableBean, InitializingBean {
}
如果我尝试像这样自动连接SearchIndexImpl:
@Autowired
private SearchIndex searchIndex;
我得到以下异常:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'IndexUpdater' available: expected single matching bean but found 2: indexDirectUpdater,indexQueueUpdater
这是意料之中的,因为 Spring 无法在 SearchIndexImpl 的构造函数中为 indexUpdater 参数自动连接哪个 IndexUpdater 实现。如何将 Spring 引导到它应该使用的 bean?我知道我可以使用 @Qualifier 注释,但这会将索引更新器硬编码为实现之一,而我希望用户能够指定要使用的索引更新器。在 XML 中,我可以执行以下操作:
<bean id="searchIndexWithDirectUpdater" class="SearchIndexImpl">
<constructor-arg index="0" ref="indexDirectUpdater"/>
</bean>
如何使用 Spring 的 Java 注释来做同样的事情?
【问题讨论】:
标签: java spring spring-annotations spring-bean