[英]How to use Spring ObjectProvider with more than one bean definition
我正在使用ObjectProvider使用 getObject() 方法創建原型作用域 bean 的實例。 像這樣的東西
@Configuration
class Config {
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
SomeType typeOne() {
return new SomeType();
}
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
SomeType typeTwo(String param) {
return new SomeType(param);
}
}
@Service
class Service {
private ObjectProvider<SomeType> objectProvider;
public Service(
ObjectProvider<SomeType> objectProvider) {
this.objectProvider = objectProvider;
}
@Override
public String performAction() {
return getSomeType().doAction();
}
private SomeType getSomeType() {
return objectProvider.getObject();
}
}
但是由於 ObjectProvider 試圖獲取的類型有兩個 bean ( SomeType
),我得到一個 NoUniqueBeanDefinitionException。 (而且我確實需要相同類型的另一個 bean,因為我需要使用 objectProvider.getObject(Object... params) 提供參數)
玩弄和調試 Spring 我看到如果你像你的 bean 一樣命名你的 ObjectProvider 那么它就可以工作,比如:
private ObjectProvider<SomeType> typeOne;
我的問題是,是否有其他方法可以使用 ObjectProvider 並設法解決歧義,或者這種方法是否可行?
簡短的回答是您只需要正確限定您想要注入的 ObjectProvider,如下所示:
public Service(@Qualifier("typeOne") ObjectProvider<SomeType> objectProvider) {
this.objectProvider = objectProvider;
}
使用 Spring 配置,當您通過方法指定 bean 並且不使用@Bean("NAME")
指定它的名稱時,Spring 使用方法名稱作為 bean 名稱。
類似地,當注入一個不是由@Qualifier("NAME")
指定的 bean 時,Spring 將注入的變量作為名稱,如果它不存在或不唯一,您可能會收到一些異常通知您(例如您面臨的 NoUniqueBeanDefinitionException)。
因此,如果匹配 bean 名稱和注入的變量名稱,則不需要更具體,但如果不匹配,@ @Qualifier
可以幫助您:D
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.