我想通过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
注入驱动程序中。但是,如果我还加载以下文件:
<bean id="customCar" class="FlyingCar">
<property name="name" value="Rocket Car"/>
<property name="maxAltitude" value="80000"/>
</bean>
我希望使用customCar
bean而不是defaultCar
bean。我最初的尝试没有用,但我认为可以说明我正在尝试实现的目标:
<bean id="carDriver" class="Driver">
<property name="car" value="#{ @customCar eq null ? 'defaultCar' : 'customCar' }"/>
</bean>
我知道如何使用来执行此操作PropertyPlaceholderConfigurer
,但是除了包含自定义bean的文件外,我不想提供属性文件/
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,但这是可行的。也许添加自定义架构元素会使这个工作变得更加整洁。
附加评论表示赞赏。
使用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
我已经研究过这个问题:Spring3:注入默认Bean,除非存在另一个Bean,如果您知道所有Bean的名称,Java配置中显示的解决方案将很好地工作,但在我的情况下,我不知道Bean被称为什么。 有人知道有什么办法可以做到这一点吗?
问题内容: 我有一堂课: 配置文件 我如何将其注入一些构造函数,即: 我希望此字符串具有从Config注入的值。那可能吗? 问题答案: 您将必须命名Bean,然后在自动装配引用该名称时使用注释。 例: 配置文件 SomeC.java
问题内容: 在应用程序中,我可以使用以下命令指定自定义日志文件: 但是,如果我不指定一个,它会去哪儿? 我在以下任何文件夹中找不到它: 我 不 具备或任何其他日志记录的依赖。 我希望有类似的东西,因为默认配置运行嵌入式Tomcat: 问题答案: Spring Boot使用Commons Logging进行所有内部日志记录,但是使底层日志实现保持打开状态。 提供了Java Util Logging,
在spring initialize之后,我希望将第二个bean的属性值合并到第一个bean中。请告知spring是否提供了动态注入值的类。
在spring mvc项目中,我想将@控制器注入到另一个bean中,如下所示: 这似乎不起作用,尽管@控制器注释是@组件的一种专门化,就像@服务(确实起作用)一样: 我还尝试直接从Application Context获取bean。 我希望避免讨论我为什么要注入控制器,以及我应该创建一个额外的抽象级别并注入它:)
问题内容: 我喜欢基于构造函数的注入,因为它允许我进行注入的字段。我还喜欢注释驱动的注入,因为它简化了我的操作。只要没有两个相同类型的参数,就可以用标记构造函数,并且一切正常。例如,我有一个课: 以及具有以下内容的应用程序上下文: 应该有一种在类的构造函数上指定bean ID的方法,但是我在文档中找不到它。是否有可能,或者我是否梦想着不存在的解决方案? 问题答案: 是按类型(在这种情况下);用于按