2013-10-05 105 views
11

訪問bean的屬性我有兩個豆子:春:從另一個bean

ConfigurationManager中:

public class ConfigurationManager 
{ 
    private Configuration configuration; 

    public void init() { ... } // Loads a configuration 

    // Getters and setters 
} 

數據中心:

public class DataCenter 
{ 
    private Configuration configuration; 

    ... 

    // Getters and setters 
} 

我想從獲得ConfigurationManager中的configuration場在我的DataCenter bean中,我不太清楚語法是什麼。

這是我的背景文件:

<bean id="configurationManager" 
     class="com.foo.ConfigurationManager" 
     init-method="init"> 
    <property name="configurationFile" value="etc/configuration.xml"/> 
</bean> 

<bean id="dataCenter" 
     class="com.foo.DataCenter"> 
    <!-- <property name="storages" ref="configurationManager."/> --> 
</bean> 

可能有人請告訴我如何做到這一點?提前致謝!

+1

可能有用:HTTP://計算器。 com/questions/1602640/spring-set-property-of-one-bean-by-reading-the-property-of-another-bean?rq = 1 –

+0

@ChrisHayes,確實有用,謝謝!但我想知道,是不是有一種更簡潔的方式來用較少的鍋爐板配置來做到這一點,或者這是唯一的/正確的方式......? – carlspring

回答

13

可以使用Spring Expression Language通過名字引用其他bean的屬性。下面是在文檔

<bean id="numberGuess" class="org.spring.samples.NumberGuess"> 
    <property name="randomNumber" value="#{ T(java.lang.Math).random() * 100.0 }"/> 

    <!-- other properties --> 
</bean> 


<bean id="shapeGuess" class="org.spring.samples.ShapeGuess"> 
    <property name="initialShapeSeed" value="#{ numberGuess.randomNumber }"/> 

    <!-- other properties --> 
</bean> 

在您的情況給出的例子中,你可以使用

<bean id="configurationManager" 
     class="com.foo.ConfigurationManager" 
     init-method="init"> 
    <property name="configurationFile" value="etc/configuration.xml"/> 
</bean> 

<bean id="dataCenter" 
     class="com.foo.DataCenter"> 
    <property name="storages" value="#{configurationManager.configuration}"/> 
</bean> 

以類似的方式,你可以使用@Value annotation in @Bean methodsuse it in @Autowired methods.

+0

感謝您的評論。恐怕這個例子不適用於自定義對象。我其實首先嚐試了這一點。如果我的字段是'String',它會起作用,但它是一個名爲'Configuration'的類。我會怎麼做呢? (或者,也許我做錯了什麼)... – carlspring

+0

@carlspring它也適用於自定義類,假設你有適當的訪問器。如果你想,你也可以使用構造函數參數並指定參數的類型。 –

+0

@carlspring老實說,我實際上有一個'Configuration' bean,它可能會在構造函數中加載它自己,並將引用傳遞給這個bean,而不是這樣做,這取決於您的需求。 –

3

試試這個

<bean id="dataCenter" class="com.foo.DataCenter"> 
    <property name="configuration" value="#{configurationManager.configuration}"/> 
</bean> 
+0

謝謝!你的兩個答案都是正確的。我正在挑選Sotiros的答案,因爲它是一個更加細緻的小問題。 – carlspring

相關問題