2013-10-05 4 views
11

Ich habe zwei Bohnen:Spring: Access-Bean-Eigenschaft von einer anderen Bohne

Configuration:

public class ConfigurationManager 
{ 
    private Configuration configuration; 

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

    // Getters and setters 
} 

DataCenter-:

public class DataCenter 
{ 
    private Configuration configuration; 

    ... 

    // Getters and setters 
} 

Ich mag das configuration Feld des Konfigurationsmanagers erhält aus innerhalb meiner DataCenter-Bean und ich bin mir nicht ganz sicher, was die Syntax ist.

Hier ist meine Kontext-Datei:

<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> 

Könnte jemand bitte mir zeigen, wie dies zu tun? Danke im Voraus!

+1

Möglicherweise nützlich verwenden: http: // Stackoverflow. com/questions/1602640/spring-set-property-of-one-by-lesen-die-eigenschaft-eines-anderen-bean? rq = 1 –

+0

@ChrisHayes, das hat tatsächlich funktioniert, mein Dank! Aber ich frage mich, gibt es nicht einen besseren Weg, um es mit weniger Kesselplatte Konfiguration zu tun, oder ist das der einzige/richtige Weg ...? – carlspring

Antwort

13

Sie Spring Expression Language zu anderen Bean-Eigenschaften nach dem Namen verweisen können. Hier ist das Beispiel in der Dokumentation gegeben

<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> 

In Ihrem Fall könnten Sie

<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> 

In ähnlicher Weise verwenden, können Sie @Value annotation in @Bean methods oder use it in @Autowired methods.

+0

Danke für Ihren Kommentar. Ich fürchte, dieses Beispiel funktioniert nicht für benutzerdefinierte Objekte. Ich habe das zuerst versucht. Es würde funktionieren, wenn mein Feld zum Beispiel "String" wäre, aber es ist eine Klasse namens "Configuration". Wie würde ich das machen? (Oder vielleicht habe ich etwas falsch gemacht) ... – carlspring

+0

@carlspring Es funktioniert auch mit benutzerdefinierten Klassen, vorausgesetzt, Sie haben die richtigen Accessoren. Wenn Sie möchten, können Sie auch Konstruktorargumente verwenden und den Typ des Arguments angeben. –

+0

@carlspring Ehrlich gesagt, hätte ich eigentlich eine 'Configuration'-Bean, die sich möglicherweise selbst im Konstruktor lädt und eine Referenz an diese Bean übergibt, anstatt es auf diese Weise zu tun, je nach Ihren Anforderungen. –

3

versuchen diese

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

Danke! Ihre beiden Antworten sind richtig. Ich wähle die Antwort von Sotiros, da es ein bisschen detaillierter ist. – carlspring

Verwandte Themen