Java 使用编程配置时的Springbean命名
当我使用XML配置定义bean时,我不需要输入名称,例如: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
<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。