在加载时选择实现

时间:2015-02-23 10:16:46

标签: spring

我使用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吗?

2 个答案:

答案 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自动装入任何其他组件。