2009-04-28 18 views
6

come faccio a modificare dinamicamente le proprietà di un bean in fase di esecuzione utilizzando java spring? Ho un bean mainView, che dovrebbe usare come proprietà "class" o "class1" o "class2". Questa decisione dovrebbe essere presa sulla base di un file di proprietà, dove la proprietà "withSmartcard" è "Y" o "N".cambia dinamicamente i fagioli di primavera

ApplicationContext:

<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

risposta

1

Usa classe factory. che può restituire istanza in base alla proprietà.

10

Utilizzare un PropertyPlaceHolder per gestire il file le proprietà ..

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

e cambiare l'attributo ref come segue:

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

Nelle proprietà il file some.where.MyApp.properties, aggiungere un chiave denominata withSmartCardClassImplementation che avrà classe1 o classe2 (scelta) per il valore.

withSmartCardClassImplementation=class1 
+0

Si suppone che sia {$ classIdToBeUsed} o $ {classIdToBeUsed}? –

+0

$ {classIdToBeUsed} :) Typo, grazie! Ovviamente, cambio classIdToBeUsed per withSmartCardClassImplementation – Olivier

4

Si desidera il PropertyPlaceholderConfigurer. Quella sezione del manuale lo dimostra meglio di quanto potrei fare sul posto.

Nell'esempio, è necessario modificare il valore della proprietà su class1 o class2 (il nome del bean desiderato nel contesto di primavera).

In alternativa, la configurazione potrebbe essere:

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

con il file di configurazione che contiene: classToUse = fully.qualified.name.of.some.Class

L'utilizzo di nomi di fagioli o di classe non sarebbe accettabile in un file di configurazione modificabile dall'utente e è necessario utilizzare "Y" e "N" come valori dei parametri di configurazione. In tal caso, devi solo farlo in Java, Spring non è pensato per essere completo.

MainView potrebbe accedere contesto applicazione direttamente:

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

Una soluzione detergente sarebbe incapsulando l'elaborazione della configurazione utente nella sua classe che farebbe quanto sopra per ridurre il numero di classi che devono essere ApplicationContextAware e iniettalo nelle altre classi, se necessario.

Utilizzando BeanFactoryPostProcessor, è possibile registrare una definizione della proprietà di classe a livello di codice.Utilizzando FactoryBean, è possibile creare un bean in modo dinamico. Entrambi sono usi piuttosto avanzati di Spring.

A parte: non sono sicuro che la configurazione di esempio sia legale, data la dipendenza ciclica tra mainView e class1/class2.

1

D'accordo con @Olivier sopra.

Ci sono molti modi per farlo.

  1. Usa PropertyPlaceholderConfigurer ..
  2. Usa BeanPostProcessor ..
  3. Usa Spring AOP, creare un consiglio e manipolare le proprietà.

Consiglierei l'articolo n. 1 sopra.

+0

Yup, a causa di KISS :) – Olivier

+0

sì, semplice e facilmente gestibile .. – Satya

Problemi correlati