Me gustaría configurar Spring a través de XML, de manera que si existe un bean en particular, se inyectará en el bean objetivo. Si no existe, se inyectará un bean diferente, predeterminado.Spring 3: Inyectar beans predeterminados a menos que haya otro Bean Presente
Por ejemplo si tengo un archivo así
<bean id="carDriver" class="Driver">
<property name="car" value="SOME EXPRESSION GOES HERE, SEE ATTEMPT BELOW"/>
</bean>
<bead id="defaultCar" class="Car">
<property name="name" value="Honda Accord"/>
</bean>
y cargarlo, me gustaría que el defaultCar
inyecta en el conductor. Sin embargo, si también carga el siguiente archivo:
<bean id="customCar" class="FlyingCar">
<property name="name" value="Rocket Car"/>
<property name="maxAltitude" value="80000"/>
</bean>
Me gustaría que el frijol customCar
a ser utilizado en lugar del grano defaultCar
. Mi primer intento no funciona, pero creo que ilustra lo que estoy tratando de lograr:
<bean id="carDriver" class="Driver">
<property name="car" value="#{ @customCar eq null ? 'defaultCar' : 'customCar' }"/>
</bean>
Yo sé cómo hacer esto con un PropertyPlaceholderConfigurer
, pero no quiero tener que proporcionar un archivo de propiedades/Propiedad de VM/variable de entorno/etc. además del archivo que contiene el bean personalizado. ¡Gracias!
Actualización:
Sobre la base de la "utilización de un grano de fábrica de" comentarios, miré en esto y se le ocurrió la siguiente solución. En primer lugar, he creado un grano de fábrica genérico que le permite especificar un nombre de frijol por defecto y un nombre de frijol de anulación:
public class DefaultOverrideFactoryBean implements FactoryBean, BeanFactoryAware {
public Object getObject() throws Exception {
return beanFactory.containsBean(overrideBeanName) ?
beanFactory.getBean(overrideBeanName) :
beanFactory.getBean(defaultBeanName);
}
public Class<?> getObjectType() {
return Object.class;
}
public boolean isSingleton() {
return true;
}
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
public void setDefaultBeanName(String defaultBeanName) {
this.defaultBeanName = defaultBeanName;
}
public void setOverrideBeanName(String overrideBeanName) {
this.overrideBeanName = overrideBeanName;
}
private String defaultBeanName;
private String overrideBeanName;
private BeanFactory beanFactory;
}
Para configurar mi ejemplo conductor del coche, usted podría hacer esto:
<bean id="carDriver" class="Driver">
<property name="car">
<bean class="DefaultOverrideFactoryBean">
<property name="defaultBeanName" value="defaultCar"/>
<property name="overrideBeanName" value="customCar"/>
</bean>
</property>
</bean>
I Hubiera preferido usar SpEL, pero esto funciona. Quizás agregar un elemento de esquema personalizado sea más limpio.
Comentarios adicionales apreciados.
¿Por qué no crea beans FactoryCar? Luego haga referencia a esa fábrica dentro de su carDriver. – chris