2014-02-15 80 views
3

當我定義使用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(); 
    } 

} 

這裏的咖啡豆被命名爲bar1bar2

現在,當我有一個模塊化應用程序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配置是否也可以這樣做?

+1

與您的問題沒有直接關係,但是......要確保一個bean不覆蓋其他bean,您可以將不同的mudules作爲子上下文,如果這符合您的情況。這個想法是,孩子上下文可以看到父母的豆子,但父母不知道孩子。 –

回答

2

有沒有辦法讓我告訴Spring不要使用bean的方法名?

簡短回答:

我認爲,在定製BeanNameGenerator堵塞會解決你的問題,但顯然沒有BeanNameGenerator用於(或至少不會在春季3.2.x中&春4.0.x版)生成@Configuration定義的bean的bean的名字

當你看看ConfigurationClassBeanDefinitionReader(line 184),你會注意到確定bean的名字是相當硬編碼的;如果可用,則使用在@Bean註釋中定義的名字,否則使用該方法的名稱。

相關問題