gpt4 book ai didi

java - 如何指定 AutoWired Bean 的子依赖项

转载 作者:行者123 更新时间:2023-12-02 09:43:09 25 4
gpt4 key购买 nike

我定义了一个 Spring 组件,如下所示:

@Component
public class SearchIndexImpl implements SearchIndex {
IndexUpdater indexUpdater;

@Autowired
public SearchIndexImpl(final IndexUpdater indexUpdater) {
Preconditions.checkNotNull(indexUpdater);
this.indexUpdater = indexUpdater;
}
}

以及 IndexUpdater 接口(interface)的两个实现,例如:

@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 注释执行相同的操作?

最佳答案

使用@Qualifier注释来指定要使用的依赖项:

public SearchIndexImpl(@Qualifier("indexDirectUpdater") IndexUpdater indexUpdater) {
Preconditions.checkNotNull(indexUpdater);
this.indexUpdater = indexUpdater;
}

请注意,自 Spring 4 起,不需要使用 @Autowired 来 Autowiring bean 的 arg 构造函数。

<小时/>

回复您的评论。

要让使用 bean 的类定义要使用的依赖项,您可以允许它定义要注入(inject)到容器中的 IndexUpdater 实例,例如:

// @Component not required any longer
public class IndexDirectUpdater implements IndexUpdater, DisposableBean, InitializingBean {

}

// @Component not required any longer
public class IndexQueueUpdater implements IndexUpdater, DisposableBean, InitializingBean {
}

在@Configuration类中声明bean:

@Configuration
public class MyConfiguration{

@Bean
public IndexUpdater getIndexUpdater(){
return new IndexDirectUpdater();
}

借助 IndexUpdater getIndexUpdater()SearchIndexImpl bean 现在将解决依赖关系。
这里我们使用 @Component 作为一个 Bean,使用 @Bean 作为其依赖项。
但我们也可以通过仅使用 @Bean 并删除 3 个类上的 @Component 来允许对 Bean 实例化进行完全控制:

@Configuration
public class MyConfiguration{

@Bean
public IndexUpdater getIndexUpdater(){
return new IndexDirectUpdater();
}

@Bean
public SearchIndexImpl getSearchIndexFoo(){
return new SearchIndexImpl(getIndexUpdater());
}

关于java - 如何指定 AutoWired Bean 的子依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56893848/

25 4 0
文章推荐: java - 如何在 Android 上选择/强制使用移动数据(或 WiFi)进行网络通话?
文章推荐: java - 选择一个后裁剪图像的最佳方式
文章推荐: java - 在 Android Room 数据库中存储 List