当我使用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名为bar1
和bar2
。
现在,当我有一个模块化的应用程序结构,其中多个配置对单个应用程序上下文有贡献时,我没有看到创建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配置是否也会这样做?
答案 0 :(得分:2)
有没有办法告诉Spring不要使用bean的方法名称?
简答:不。
我认为插入自定义的BeanNameGenerator
可以解决您的问题,但显然没有BeanNameGenerator
用于生成@Configuration
类中定义的bean的bean名称(或者至少不是在春季3.2.x和春季4.0.x)。
当您查看ConfigurationClassBeanDefinitionReader
(第184行)时,您会注意到确定bean名称是非常硬编码的;如果可用,则使用@Bean
注释中定义的名字,否则使用方法的名称。