2012-02-03 19 views
10
<bean id="Mybean" class="Bean"> 
    <property name="config" ref="dev"/> 
</bean> 

<bean id="dev" class="Dev"> 
    <property name="x" ref="Dev1"> 
    <property name="y" ref="Dev2"> 
    <property name="z" ref="Dev3"> 
</bean> 

<bean id="stag" class="Dev"> 
    <property name="x" ref="Stag1"> 
    <property name="y" ref="Stag2"> 
    <property name="z" ref="Stag3"> 
</bean> 

Nello scenario sopra riportato, la proprietà config nel bean MyBean cambia da ambiente a ambiente. Al momento dello sviluppo, il riferimento della configurazione cambia in dev. E nella messa in scena, il riferimento cambia a stag. Il problema arriva al momento del check-in nel file di primavera. Dobbiamo analizzare ogni volta il riferimento della configurazione prima di effettuare il check-in. Se il riferimento della configurazione con il valore di dev è stato archiviato, potremmo dover spiegare un sacco di domande.Come impostare dinamicamente un riferimento bean in primavera?

C'è qualche soluzione da risolvere per renderlo automatico?
Nota: la versione Spring è 2.0.1

+0

Non esiste una cosa come Spring 2.1. C'è 2.0 e 2.5. Intendi 3.1? – skaffman

+0

Stai usando Maven? –

risposta

9

Utilizzare il PropertyPlaceholderConfigurer dalla primavera, e rimuovere un bean inutilizzato:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location"> 
     <value>env.properties</value> 
    </property> 
</bean> 

<bean id="Mybean" class="Bean"> 
    <property name="config" ref="config"/> 
</bean> 

<bean id="config" class="Config"> 
    <property name="x" ref="${x}"> 
    <property name="y" ref="${y}"> 
    <property name="z" ref="${z}"> 
</bean> 

e il file env.properties contiene le seguenti proprietà:

x=Dev1 
y=Dev2 
z=Dev3 

o

x=Stag1 
y=Stag2 
z=Stag3 
1

Spring fornisce un meccanismo denominato segnaposto di proprietà. In questo modo è possibile impostare determinate proprietà in un database/file di proprietà e Spring le riempirà all'avvio.

La classe da utilizzare per questa posizione è here.

+0

La soluzione non funziona ... Si sta dando errore che il bean con il nome {dev} non è definito .. Qualche aiuto ?? – Shashi

2

È possibile farlo utilizzando PropertyPlaceholderConfigurer o utilizzando @Profile

anche vedere

+1

@ShashiBhushan: [PropertyPlaceholderConfigurer] (http://static.springsource.org/spring/docs/1.0.0/api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html) è in primavera dal 1.0. – beny23

+0

Sta dando errore che il bean con il nome {dev} non è definito .. Qualsiasi aiuto .. Può essere il PropertyPlaceholderConfigure viene utilizzato per fornire "valore" dinamico, non il "ref" dinamico. Shashi

+1

Hai dimenticato il "$": 'ref =" $ {dev} "' –

3

Supponendo che si intende Primavera 3.1, piuttosto che Primavera 2.1 (che non esiste), quindi puoi utilizzare il nuovo "En funzione "Profili professionali" introdotta in 3.1. Ciò consente di definire un set di bean per ciascuno dei tuoi ambienti, quindi selezionarne uno "attivo" in fase di runtime.

Vedere questo SpringSource Blog Entry per esempi.

4
  1. a configurare il fagiolo segnaposto da specfiy, lasciate primavera so che vuoi il segnaposto
  2. istituito la configurazione per il "mio fagiolo" utilizzando il "$ {env}"

per esempio:

<beans> 
<bean id="configBean" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
      <property name="location"><value>env.properties</value></property> 
</bean> 

<bean id="Mybean" class="Bean"> 
    <property name="config" ref="${env}"/> 
</bean> 

</beans> 

e avete bisogno di aggiungere il valore-chiave env = dev alle env.properties presentare

2

PropertyPlaceholderConfigurer è la risposta , tuttavia, immagino che ti piacerebbe che ciò accada senza la necessità di aggiornare il file delle proprietà per ogni ambiente.

Il mio suggerimento sarebbe quindi la seguente

  1. Usa PropertyPlaceholderConfigurer, ma non creare un file di proprietà
  2. Per impostazione predefinita, PropertyPlaceholderConfigurer primi tentativi per trovare un valore in un file di proprietà, ma se non funziona, cercherà uno in proprietà del sistema

Quindi tutto quello che dovete fare è quello di definire entrambi i fagioli lo stesso modo in cui si sta facendo, ad esempio dev e stag .. che è un buon approccio dato che stai mostrando chiaramente le diverse configurazioni ... sarebbe di grande aiuto se tu aggiungessi qualche alias per mostrare chiaramente l'impostazione che vuoi usare.

Quindi passare una proprietà di sistema che definisce la modalità in cui ci si trova ... e idealmente impostare PropertyPlaceholderConfigurer per utilizzare le proprietà di sistema.

Quindi .. il vostro config sarebbe simile a questa

<bean 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"  
    systemPropertiesMode="2"/> 

<bean id="Mybean" class="Bean"> 
    <property name="config" ref="${launch.mode}"/> 
</bean> 

<bean id="dev" name="dev_mode" class="Dev"> 
    <property name="x" ref="Dev1"> 
    <property name="y" ref="Dev2"> 
    <property name="z" ref="Dev3"> 
</bean> 

<bean id="stag" name="staging_mode" class="Dev"> 
    <property name="x" ref="Stag1"> 
    <property name="y" ref="Stag2"> 
    <property name="z" ref="Stag3"> 
</bean> 

È quindi possibile passare nella proprietà all'avvio nel modo seguente

-D<property-name>=<value> 

Quindi in questo caso devi usare

-Dlaunch.mode=dev_mode 

O

-Dlaunch.mode=staging_mode 

E non sarà necessario toccare alcun file di configurazione.

Solo una nota ulteriore sul systemPropertiesMode, valori accettati sono i seguenti:

  • 0 - mai guardare nelle proprietà di sistema
  • 1 - proprietà di sistema uso come ripiego (cioè se non si trova nei file di proprietà)
  • 2 - proprietà di sistema sostituiscono sempre (la modalità che sto suggerendo)

Speranza che aiuta :)

Nota: questo consiglio si applica solo alla primavera < 3.1, poiché dalla 3.1 in poi, l'approccio consigliato è quello di utilizzare @Profile

Problemi correlati