2015-02-23 3 views
0

Я использую весну 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; 
} 

Можно ли вводить firstVersionBean, если мое логическое истинно и ложно, если использование secondVersionBean?

ответ

0

TL; DR

Вы можете добиться того, что вы хотите с помощью SPELтройного оператора для проверки реквизита логического значения и ввести соответственно beanA или beanB версию (Spring 4 получает эту идею шаг далее, вводя @ Конкретный).

либо с использованием аннотаций:

@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-определенный компонент и BeanD, как это сделать, используя компонент, связанный с аннотацией:

Common Inter сталкиваются с

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 
+0

Я не понимаю, почему это была бы плохая идея. Я использую интерфейс во всех других местах ввода. –

+0

Пересмотренный мой ответ с тех пор, как я думал, вы подразумеваете подмену Spring lib. Надеюсь, теперь это хорошо понято. – dimitrisli

+0

Это именно то, что я хочу. Но для примера вам нужно переименовать свой интерфейс (что-то вроде Service, FirstService, SecondService, computeSomeValue) и метода, потому что это немного запутывает, как вы. –

0

Вместо того, чтобы создать два экземпляра боба и выяснить, реализация для использования на основе свойства конфигурации, это, вероятно, проще просто создать в первую очередь один 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; 
    } 
} 

Тогда вы можете autowire VersionBean в любой из других компонентов.

+0

Вот и все, не получается ли это с помощью xml-конфигурации? –