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.
se supone que debe haber {} $ classIdToBeUsed o $ {} classIdToBeUsed? –
$ {classIdToBeUsed} :) Error tipográfico, ¡gracias! Obviamente, yo cambio de classIdToBeUsed withSmartCardClassImplementation – Olivier