2012-02-03 24 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> 

En la situación anterior, la propiedad config en el bean MyBean cambia del entorno al entorno. En el momento de dev, la referencia de configuración cambia a dev. Y en la puesta en escena, la referencia cambia a stag. El problema viene en el momento de verificarse en el archivo de primavera. Tenemos que analizar cada vez la referencia de config antes de registrarnos. Si la referencia de config con el valor de dev se registró, es posible que tengamos que explicar muchas preguntas.¿Cómo establecer dinámicamente una referencia de bean en Spring?

¿Hay alguna solución para resolver para automatizar?
Nota: La versión de Spring es 2.0.1

+0

No existe el resorte 2.1. Hay 2.0 y 2.5. ¿Te refieres a 3.1? – skaffman

+0

¿Estás usando Maven? –

Respuesta

9

Usar la PropertyPlaceholderConfigurer partir de la primavera, y quitar sin usar un bean:

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

y el archivo env.properties contiene las siguientes propiedades:

x=Dev1 
y=Dev2 
z=Dev3 

o

x=Stag1 
y=Stag2 
z=Stag3 
1

Spring proporciona un mecanismo denominado marcadores de posición de propiedad. De esta manera puede establecer ciertas propiedades en un archivo de base de datos/propiedades y Spring las rellenará al inicio.

La clase a utilizar para esto se encuentra here.

+0

La solución no funciona ... Da el error de que el bean con el nombre {dev} no está definido ... ¿Alguna ayuda? – Shashi

2

Puede hacerlo utilizando PropertyPlaceholderConfigurer o el uso de @Profile

también vemos

+1

@ShashiBhushan: [PropertyPlaceholderConfigurer] (http://static.springsource.org/spring/docs/1.0.0/api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html) ha estado en Spring desde 1.0. – beny23

+0

Está dando error que el bean con el nombre {dev} no está definido. Cualquier Ayuda. Puede ser que la PropertyPlaceholderConfigure se use para proporcionar un "valor" dinámico, no el "ref" dinámico. Shashi

+1

Olvidó el "$": 'ref =" $ {dev} "' –

3

Suponiendo que significaba Primavera 3.1, en lugar de la primavera 2,1 (que no existe), entonces puede usar el nuevo "En la característica Perfiles del entorno que se introdujo en 3.1. Esto le permite definir un conjunto de beans para cada uno de sus entornos, y luego seleccionar el "activo" en el tiempo de ejecución.

Vea esto SpringSource Blog Entry para ejemplos.

4
  1. configuración de la haba de marcador de posición por specfiy, dejar que la primavera sabe que desea que el marcador de posición
  2. estableció la configuración para el "mi frijol" utilizando el "$ {entorno}"

de ejemplo:

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

y necesitas añadir el env = dev la clave-valor a las env.properties presentar

2

PropertyPlaceholderConfigurer es la respuesta , sin embargo, me imagino que le gustaría que esto suceda sin la necesidad de seguir actualizando su archivo de propiedades para cada entorno.Por lo tanto,

Mi sugerencia sería la siguiente

  1. Uso PropertyPlaceholderConfigurer, pero no se crea un archivo de propiedades
  2. Por defecto, PropertyPlaceholderConfigurer primeros intentos para encontrar un valor en un archivo de propiedades, pero si eso no funciona, buscará una en las propiedades del sistema

Así que todo lo que necesita hacer es definir los dos granos de la misma forma en que lo está haciendo, es decir dev y stag .. que es un buen enfoque ya que muestra claramente las diferentes configuraciones ... ayudaría si también agregó un alias para mostrar claramente la configuración que desea usar.

A continuación, pase una propiedad del sistema que defina en qué modo se encuentra ... e idealmente configure explícitamente PropertyPlaceholderConfigurer para usar las propiedades del sistema.

Así que .. su configuración se vería algo como esto

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

A continuación puede pasar en la propiedad durante el inicio de la siguiente manera

-D<property-name>=<value> 

lo tanto, en este caso tendrá que utilizar

-Dlaunch.mode=dev_mode 

O

-Dlaunch.mode=staging_mode 

Y no necesitará tocar ninguno de los archivos de configuración.

Sólo una nota más adelante systemPropertiesMode, valores aceptados son los siguientes:

  • 0 - nunca mirar en las propiedades del sistema
  • 1 - propiedades del sistema uso como punto de retorno (es decir, si no se encuentra en los archivos de propiedades)
  • 2 - propiedades del sistema siempre anulan (el modo que estoy sugiriendo)

espero que ayude :)

Nota: Esta recomendación solo se aplica al resorte < 3.1, ya que de 3.1 en adelante, el enfoque recomendado es usar @Profile

Cuestiones relacionadas