我想通過XML配置Spring,如果某個特定的bean存在,它將被注入到目標bean中。如果它不存在,則會注入一個不同的默認bean。Spring 3:注入默認bean,除非另一個Bean存在
例如,如果我有這樣的
<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>
文件並加載它,我想注入駕駛員defaultCar
。但是,如果我還加載以下文件:
<bean id="customCar" class="FlyingCar">
<property name="name" value="Rocket Car"/>
<property name="maxAltitude" value="80000"/>
</bean>
我希望被用來代替defaultCar
豆的豆customCar
。我最初的嘗試不起作用,但我想說明什麼,我想要實現:
<bean id="carDriver" class="Driver">
<property name="car" value="#{ @customCar eq null ? 'defaultCar' : 'customCar' }"/>
</bean>
我知道如何與一個PropertyPlaceholderConfigurer
做到這一點,但我不希望有提供屬性文件/ VM屬性/環境變量/等等,除了包含自定義bean的文件。謝謝!
更新:
基於「使用工廠豆」的評論,我看着這個並用以下解決方案上來。首先,我創建了一個通用工廠bean,允許你指定一個默認的bean名稱和覆蓋bean名字:
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;
}
配置我的例子車司機,你可以這樣做:
<bean id="carDriver" class="Driver">
<property name="car">
<bean class="DefaultOverrideFactoryBean">
<property name="defaultBeanName" value="defaultCar"/>
<property name="overrideBeanName" value="customCar"/>
</bean>
</property>
</bean>
我本來會傾向於使用SpEL,但這是有效的。也許增加一個自定義的模式元素會使這個更清潔。
其他意見讚賞。
爲什麼不創建FactoryCar bean。然後在您的carDriver中引用該工廠。 – chris 2011-03-29 00:24:26