簡體   English   中英

使用編程配置時Spring Bean命名

[英]Spring Bean naming when using programmatic configuration

當我使用XML配置定義bean時,我不需要輸入名稱,例如:

<beans>
  <bean class="foo.Bar" />
  <bean class="foo.Bar" />
</beans>

這些名稱將在內部被設置為類似於foo.bar$1 (或類似的東西,我現在沒有考慮到確切的模式)。

但是,當我使用Java配置定義bean時,名稱隱含地從帶注釋的方法的名稱派生:

@Configuration
public class DummyConfiguration {

  @Bean
  public Bar bar1() {
    return new Bar();
  }

  @Bean
  public Bar bar2() {
    return new Bar();
  }

}

這里的bean名為bar1bar2

現在,當我有一個模塊化應用程序結構,其中多個配置對單個應用程序上下文有貢獻時,我沒有看到創建多個Bar實例的方法,同時確保不會覆蓋另一個。

例如,我的應用程序的一部分定義了以下配置:

@Configuration
public class ConfigurationForModuleA {

  @Bean
  public FooManager fooManager() {
    return new FooManagerImpl();
  }

  @Bean
  public SomeListener someListener() {
    return new FooSomeListener();
  }

}

另一部分(不知道第一部分)定義了這種配置:

@Configuration
public class ConfigurationForModuleB {

  @Bean
  public BarManager barManager() {
    return new BarManagerImpl();
  }

  @Bean
  public SomeListener someListener() {
    return new BarSomeListener();
  }

}

會發生的是,只有一個SomeListener實現將在上下文中可用,因為兩個偵聽器實現都是在名稱someListener下定義的,最后一個定義將覆蓋第一個。

有沒有辦法告訴Spring不要使用bean的方法名稱? 我知道我也可以使用@Bean("explicitName")但這不能解決我的問題。 我仍然需要發明某種命名模式並將該模式​​應用於我的所有bean聲明,以確保名稱是唯一的。 當使用XML Spring處理這個問題時,Java配置是否也會這樣做?

有沒有辦法告訴Spring不要使用bean的方法名稱?

簡答:

我認為插入一個自定義的BeanNameGenerator可以解決你的問題,但顯然沒有使用BeanNameGenerator來生成@Configuration類中定義的bean的bean名稱(或者至少不在spring 3.2.x和spring 4.0.x中)

當您查看ConfigurationClassBeanDefinitionReader (第184行)時 ,您會注意到確定bean名稱是非常硬編碼的; 如果可用,則使用@Bean注釋上定義的名字,否則使用方法的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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