2013-10-05 15 views
11

Mam dwie fasoli:Wiosna: nieruchomość fasola dostęp z innej fasoli

ConfigurationManager:

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 
} 

chciałbym uzyskać pole konfiguracji ConfigurationManager configuration od w obrębie komponentu bean DataCenter i nie jestem do końca pewien, jaka jest składnia.

Oto mój plik kontekst:

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

Czy ktoś proszę mi pokazać, jak to zrobić? Z góry dziękuję!

+1

Ewentualnie przydatne: http: // stackoverflow. com/questions/1602640/spring-set-property-of-one-bean-by-reading-the-property-of-another-bean? rq = 1 –

+0

@ChrisHayes, to rzeczywiście działa, dziękuję! Ale zastanawiam się, czy nie ma na to lepszego sposobu, z mniejszą konfiguracją płyty kotła, czy jest to jedyny/poprawny sposób ...? – carlspring

Odpowiedz

13

Spring Expression Language można używać w odniesieniu do innych właściwości fasoli według nazwy. Oto przykład podano w docs

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

w twoim przypadku można użyć

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

W podobny sposób można użyć @Value annotation in @Bean methods lub use it in @Autowired methods.

+0

Dzięki za komentarz. Obawiam się, że ten przykład nie działa dla niestandardowych obiektów. Tak naprawdę to wypróbowałem. To działałoby, gdyby moje pole było na przykład 'String', ale jest to klasa o nazwie' Konfiguracja'. Jak mam to zrobić? (A może zrobiłem coś złego) ... – carlspring

+0

@carlspring Działa z klasami niestandardowymi, zakładając, że masz odpowiednich akcesorów. Jeśli chcesz, możesz również użyć argumentów konstruktora i określić typ argumentu. –

+0

@carlspring Szczerze mówiąc, faktycznie miałbym komponent 'Configuration', który prawdopodobnie wczytał się w konstruktorze i przekazał odwołanie do tej fasoli zamiast robić to w ten sposób, w zależności od twoich wymagań. –

3

spróbować

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

Dzięki! Obie twoje odpowiedzi są poprawne. Wybieram odpowiedź Sotirosa, ponieważ jest bardziej szczegółowa. – carlspring

Powiązane problemy