2015-09-30 101 views
0

在一個模塊化的Spring配置應用程序中,我們使用工廠bean來跨模塊邊界提供bean實例。如何避免Spring配置Java配置bean

例如,一個模塊可由名稱名稱暴露bean實例。然後另一個模塊可以通過風格

<bean id="nameBean" class="com.zfabrik.springframework.ComponentFactoryBean"> 
    <property name="componentName" value="A/name" /> 
    <property name="className" value="a.AInterface" /> 
</bean> 

注意模塊已分離的類加載器層次結構和實際的實現類的A /名稱的聲明消耗是豆可能無法在可見。就好像在OSGI中一樣(儘管這不是OSGi)。

我的目標是在一個綱領性的應用程序上下文中提供A /名稱。然而試圖

@Configuration 
public static class AppContext { 
    @Bean AInterface nameBean() { 
    return lookup("A/name",AInterface.class); 
    } 
} 

時(查找不實際的實例檢索)我看到Spring試圖配置返回的實例。例如,它將嘗試解析@Autowired屬性A /名稱的實現類 - 這在B(並且查找的協議總是提供完全配置的東西)的上下文中沒有意義。即使如果我嘗試

@Configuration 
public static class AppContext { 
    @Bean(autowire=Autowire.NO) AInterface nameBean() { 
    return lookup("A/name",AInterface.class); 
    } 
} 

它會去配置返回的實例。

如何在不觸及其實現實例的情況下爲應用程序上下文提供一個bean?

編輯:由Sotirios Delimanolis建議,返回FactoryBean做AFAICT避免Spring配置返回的實例。

的替代代碼如下所示:

@Configuration 
public static class AppContext { 
    @Bean FactoryBean<AInterface> nameBean() { 
    return new ComponentFactoryBean("A/name",AInterface.class); 
    } 
} 

這不是因爲的FactoryBean在返回類型的@UntouchedBean標註爲酷,但它解決了這個問題。

@Sotirios:請建議作爲答案,以便我可以相應地標記您的建議。

/編輯

+0

你能提供一個真實的,可重複的例子,或澄清你想要發生什麼與實際發生的事情? –

+0

_Spring是什麼意思是試圖配置返回的instance_?無論從@ @ Bean方法返回的是Spring bean,都受Spring處理。 –

+0

當通過工廠bean和XML聲明提供bean時,Spring將不會配置返回的實例。它將簡單地將它添加到bean工廠。我正在尋找類似的東西在Java配置中使用 - 儘管沒有工廠bean。 – gnomie

回答

0

好的,就這樣它可以關閉。建議並接受的答案是返回工廠bean。