Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用编程配置时的Springbean命名_Java_Spring_Configuration - Fatal编程技术网

Java 使用编程配置时的Springbean命名

Java 使用编程配置时的Springbean命名,java,spring,configuration,Java,Spring,Configuration,当我使用XML配置定义bean时,我不需要输入名称,例如: <beans> <bean class="foo.Bar" /> <bean class="foo.Bar" /> </beans> 在这里,bean被命名为bar1和bar2 现在,当我有一个模块化的应用程序结构,其中多个配置有助于一个应用程序上下文时,我看不到一种方法来创建多个Bar实例,同时确保其中一个不会覆盖另一个 例如,我的应用程序的一部分定义了以下配置: @Confi

当我使用XML配置定义bean时,我不需要输入名称,例如:

<beans>
  <bean class="foo.Bar" />
  <bean class="foo.Bar" />
</beans>
在这里,bean被命名为
bar1
bar2

现在,当我有一个模块化的应用程序结构,其中多个配置有助于一个应用程序上下文时,我看不到一种方法来创建多个
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();
  }

}
另一部分(不知道第一部分)定义了此配置:

@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声明,确保名称是唯一的。当使用XMLSpring时,有没有办法让Java配置也能做到这一点

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

简短回答:

我原以为插入定制的bean可以解决您的问题,但显然没有
BeanNameGenerator
用于生成
@Configuration
类中定义的bean的bean名称(至少在spring 3.2.x和spring 4.0.x中没有)


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

与您的问题没有直接关系,但。。。为了确保一个bean不会覆盖另一个bean,如果适合您的情况,您可以将不同的mudule作为子上下文。其思想是,子上下文可以看到父bean,但父bean不知道子bean。