2009-04-28 22 views
6

¿Cómo cambio dinámicamente las propiedades de un frijol en tiempo de ejecución usando un resorte de java? Tengo un bean mainView, que debe usar como propiedad "class" ya sea "class1" o "class2". Esta decisión debe tomarse sobre la base de un archivo de propiedades, donde la propiedad "withSmartcard" es "Y" o "N".dinámicamente cambiar los granos de primavera

Application Context:

<bean id="mainView" 
    class="mainView"> 
    <property name="angebotsClient" ref="angebotsClient" /> 
    <property name="class" ref="class1" /> 
</bean> 



<bean id="class1" 
    class="class1"> 
    <constructor-arg ref="mainView" /> 
</bean> 

<bean id="class2" 
    class="class2"> 
    <constructor-arg ref="mainView" /> 
</bean> 

PropertyFile:

withSmartcard = Y

Respuesta

1

fábrica Uso clase. que puede devolver la instancia sobre la base de su propiedad.

10

Use un PropertyPlaceHolder para gestionar el archivo de propiedades ..

<bean id="myPropertyPlaceHolder" 
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <description>The service properties file</description> 
    <property name="location" value="classpath:/some.where.MyApp.properties" /> 
    </bean> 

y cambiar su atributo ref de la siguiente manera:

<bean id="mainView" 
    class="mainView"> 
    <property name="angebotsClient" ref="angebotsClient" /> 
    <property name="class" ref="${withSmartCardClassImplementation}" /> 
</bean> 

En su archivo de propiedades some.where.MyApp.properties, añadir una clave llamada con SmartCardClassImplementation que tendrá class1 o class2 (usted elige) para el valor.

withSmartCardClassImplementation=class1 
+0

se supone que debe haber {} $ classIdToBeUsed o $ {} classIdToBeUsed? –

+0

$ {classIdToBeUsed} :) Error tipográfico, ¡gracias! Obviamente, yo cambio de classIdToBeUsed withSmartCardClassImplementation – Olivier

4

Desea que PropertyPlaceholderConfigurer. Esa sección del manual lo demuestra mejor de lo que pude en el acto.

En su ejemplo, deberá cambiar el valor de la propiedad a class1 o class2 (el nombre del bean deseado en el contexto de primavera).

Alternativamente, la configuración podría ser:

<bean id="mainView" 
    class="mainView"> 
    <property name="angebotsClient" ref="angebotsClient" /> 
    <property name="class"> 
     <bean class="${classToUse}"> 
      <constructor-arg ref="mainView"/> 
     </bean> 
    </property> 
</bean> 

con el archivo de configuración que contiene: classToUse = fully.qualified.name.of.some.Class

El uso de nombres de frijol o de clase no sería aceptable en un archivo de configuración editable por el usuario, y realmente necesita usar "Y" y "N" como los valores de los parámetros de configuración. En ese caso, solo tendrá que hacer esto en Java, Spring no está destinado a ser completo.

MAINVIEW podría acceder al contexto de aplicación directamente:

if (this.withSmartCards) { 
    this.class_ = context.getBean("class1"); 
} else { 
    this.class_ = context.getBean("class2"); 
} 

una solución más limpia se encapsulando el procesamiento de la configuración de usuario en su propia clase que hacer lo anterior para reducir el número de clases que necesitan ser ApplicationContextAware e inyectarlo en tus otras clases según sea necesario.

Utilizando BeanFactoryPostProcessor, puede registrar una definición de la propiedad de clase mediante programación.Usando FactoryBean, puede crear un bean dinámicamente. Ambos son usos algo avanzados de Spring.

Un aparte: No estoy seguro de si su ejemplo de configuración es legal, dada la dependencia cíclica entre MAINVIEW y clase 1/clase 2.

1

De acuerdo con @Olivier anteriormente.

Hay muchas formas de hacerlo.

  1. Uso PropertyPlaceHolderConfigurer ..
  2. Uso BeanPostProcessor ..
  3. Uso primavera AOP, crear un consejo y manipular las propiedades.

recomendaría Artículo: 1 anterior.

+0

Sí, debido a Kiss :) – Olivier

+0

sip, simple y fácilmente manejable .. – Satya

Cuestiones relacionadas