[英]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名為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();
}
}
會發生的是,只有一個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.