當我定義使用XML配置bean定義我並不需要輸入一個名稱,例如命名:的Spring bean當使用編程配置
<beans>
<bean class="foo.Bar" />
<bean class="foo.Bar" />
</beans>
的名稱將內部設定爲像foo.bar$1
(或類似的事情,我現在沒有確切的模式)。
然而,當我定義使用Java配置中的名稱是從隱含註解的方法的名稱deriven豆:
@Configuration
public class DummyConfiguration {
@Bean
public Bar bar1() {
return new Bar();
}
@Bean
public Bar bar2() {
return new Bar();
}
}
這裏的咖啡豆被命名爲bar1
和bar2
。
現在,當我有一個模塊化應用程序strucure,其中多個配置有助於單個應用程序上下文時,我沒有看到創建多個實例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配置是否也可以這樣做?
與您的問題沒有直接關係,但是......要確保一個bean不覆蓋其他bean,您可以將不同的mudules作爲子上下文,如果這符合您的情況。這個想法是,孩子上下文可以看到父母的豆子,但父母不知道孩子。 –