我想通过XML配置Spring,以便如果存在特定的bean,它将注入到目标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注入驱动程序中。但是,如果我还加载以下文件:
defaultCar
<bean id="customCar" class="FlyingCar"> <property name="name" value="Rocket Car"/> <property name="maxAltitude" value="80000"/> </bean>
我希望使用customCarbean而不是defaultCarbean。我最初的尝试没有用,但我认为可以说明我正在尝试实现的目标:
customCar
<bean id="carDriver" class="Driver"> <property name="car" value="#{ @customCar eq null ? 'defaultCar' : 'customCar' }"/> </bean>
我知道如何使用来执行此操作PropertyPlaceholderConfigurer,但是除了包含自定义bean的文件外,我不想提供属性文件/ VM属性/环境变量/等。谢谢!
PropertyPlaceholderConfigurer
更新:
基于“使用工厂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,但这是可行的。也许添加自定义架构元素会使这个工作变得更加整洁。
附加评论表示赞赏。
使用FactoryBean是最简单的解决方案-您可以描述所需的任何算法。有关更多信息,请访问
http://docs.spring.io/spring/docs/current/javadoc- api/org/springframework/beans/factory/FactoryBean.html
http://docs.spring.io/spring/docs/current/spring-framework- reference/html/beans.html#beans-factory-extension- factorybean