У меня компонент 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 не может определить, какую реализацию IndexUpdater
нужно автоматически подключить для параметра indexUpdater
в конструкторе SearchIndexImpl
. Как мне привести Spring к бину, который он должен использовать? Я понимаю, что могу использовать аннотацию @Qualifier
, но это жестко закодирует средство обновления индекса для одной из реализаций, в то время как я хочу, чтобы пользователь мог указать, какое средство обновления индекса использовать. В XML я могу сделать что-то вроде:
<bean id="searchIndexWithDirectUpdater" class="SearchIndexImpl">
<constructor-arg index="0" ref="indexDirectUpdater"/>
</bean>
Как мне сделать то же самое, используя аннотации Spring в Java?