使用编程配置时Spring Bean命名

时间:2014-02-15 13:30:00

标签: java spring 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的多个实例的方法,同时确保不会覆盖另一个。{1}}。

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

@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配置是否也会这样做?

1 个答案:

答案 0 :(得分:2)

  

有没有办法告诉Spring不要使用bean的方法名称?

简答:

我认为插入自定义的BeanNameGenerator可以解决您的问题,但显然没有BeanNameGenerator用于生成@Configuration中定义的bean的bean名称(或者至少不是在春季3.2.x和春季4.0.x)

当您查看ConfigurationClassBeanDefinitionReader (第184行)时,您会注意到确定bean名称是非常硬编码的;如果可用,则使用@Bean注释中定义的名字,否则使用方法的名称。