我使用spring 3.2.13.RELEASE。 我在属性文件中有一个布尔属性来激活版本或其他版本。
我有以下豆子:
public interface VersionBean{
void doSomething();
}
public class FirstVersionBean implements VersionBean{
}
public class SecondVersionBean implements VersionBean{
}
public class Service{
private VersionBean versionBean;
}
如果我的布尔值为true,是否可以注入firstVersionBean?如果使用false,则可以使用secondVersionBean吗?
答案 0 :(得分:1)
<强> TL; DR 强>
您可以使用 Spel 三元运算符来检查道具布尔值并相应地注入 beanA 或 beanB < / em>版本(Spring 4让这个想法进一步引入 @Conditional )。
使用注释:
@Value("#{${flag} ? beanA : beanB }")
private IntAB b;
或在XML配置中:
<bean id="beanC" class="com.dimitrisli.example.BeanC">
<property name="b" value="#{${flag} ? beanA : beanB }"/>
</bean>
这是一个完整的示例,BeanC演示如何使用XML定义的bean和BeanD如何使用注释定义的bean来完成它:
通用界面
public interface IntAB {
public String myBean();
}
<强> BeanA 强>
public class BeanA implements IntAB {
@Override
public String myBean() { return "BeanA"; }
}
<强> BeanB 强>
public class BeanB implements IntAB {
@Override
public String myBean() { return "BeanB"; }
}
<强> BeanC 强>
public class BeanC {
private IntAB b;
public void setB(IntAB b) { this.b = b; }
public String myBean() { return b.myBean(); }
}
<强> BeanD 强>
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class BeanD {
@Value("#{${flag} ? beanA : beanB }")
private IntAB b;
public String myBean() { return b.myBean(); }
}
申请背景
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="app.properties"/>
<context:component-scan base-package="com.dimitrisli.example"/>
<bean id="beanA" class="com.dimitrisli.example.BeanA" />
<bean id="beanB" class="com.dimitrisli.example.BeanB" />
<bean id="beanC" class="com.dimitrisli.example.BeanC">
<property name="b" value="#{${flag} ? beanA : beanB }"/>
</bean>
</beans>
主要强>
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring/application-context.spring.xml");
BeanC c = (BeanC) ctx.getBean("beanC");
BeanD d = (BeanD) ctx.getBean("beanD");
System.out.println(c.myBean());
System.out.println(d.myBean());
}
}
<强> app.properties 强>
flag=false
答案 1 :(得分:0)
不是创建两个bean实例并根据config属性确定要使用哪个实现,而是首先简单地创建单个VersionBean
可能更容易。例如,像这样:
@Configuration
public class YourConfigClass {
private boolean yourBool;
@Bean
public VersionBean versionBean() {
if (yourbool)
return new FirstVersionBean();
else
return new SecondVersionBean();
}
@Value("${some.config.property}")
public void setYourBool(boolean value) {
this.yourBool = value;
}
}
然后,您可以将VersionBean
自动装入任何其他组件。