猿问

如何为 AutoWired Bean 指定子依赖

我有一个这样定义的 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自动连接哪个实现。我如何将 Spring 引导到它应该使用的 bean?我知道我可以使用注释,但这会将索引更新程序硬编码为实现之一,而我希望用户能够指定要使用的索引更新程序。在 XML 中,我可以这样做:indexUpdaterSearchIndexImpl@Qualifier


<bean id="searchIndexWithDirectUpdater" class="SearchIndexImpl"> 

    <constructor-arg index="0" ref="indexDirectUpdater"/>

</bean>

我如何使用 Spring 的 Java 注释来做同样的事情?


长风秋雁
浏览 96回答 1
1回答

慕森卡

使用@Qualifier注释指定要使用的依赖项:public SearchIndexImpl(@Qualifier("indexDirectUpdater") IndexUpdater indexUpdater) {&nbsp; &nbsp; Preconditions.checkNotNull(indexUpdater);&nbsp; &nbsp; this.indexUpdater = indexUpdater;}请注意,@Autowired自 Spring 4 以来,不需要自动装配 bean 的 arg 构造函数。回答你的评论。要让将使用 bean 的类定义要使用的依赖项,您可以允许它定义IndexUpdater要注入容器的实例,例如:// @Component not required any longerpublic class IndexDirectUpdater implements IndexUpdater, DisposableBean, InitializingBean {}// @Component not required any longerpublic class IndexQueueUpdater implements IndexUpdater, DisposableBean, InitializingBean {}在 @Configuration 类中声明 bean:@Configurationpublic class MyConfiguration{@Beanpublic IndexUpdater getIndexUpdater(){&nbsp; &nbsp; &nbsp;return new IndexDirectUpdater();}SearchIndexImpl由于 .bean 现在将解决依赖 关系IndexUpdater getIndexUpdater()。在这里,我们使用@Component一个 bean 及其@Bean依赖项。但是我们也可以通过仅使用和删除3 个类来允许对要实例化的 bean 进行完全控制:@Bean@Component@Configurationpublic class MyConfiguration{@Beanpublic IndexUpdater getIndexUpdater(){&nbsp; &nbsp; &nbsp;return new IndexDirectUpdater();}@Bean&nbsp;public SearchIndexImpl getSearchIndexFoo(){&nbsp; &nbsp; &nbsp;return new SearchIndexImpl(getIndexUpdater());}
随时随地看视频慕课网APP

相关分类

Java
我要回答