簡體   English   中英

如何使用具有多個 bean 定義的 Spring ObjectProvider

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM