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.
Si suppone che sia {$ classIdToBeUsed} o $ {classIdToBeUsed}? –
$ {classIdToBeUsed} :) Typo, grazie! Ovviamente, cambio classIdToBeUsed per withSmartCardClassImplementation – Olivier