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
Я не понимаю, почему это была бы плохая идея. Я использую интерфейс во всех других местах ввода. –
Пересмотренный мой ответ с тех пор, как я думал, вы подразумеваете подмену Spring lib. Надеюсь, теперь это хорошо понято. – dimitrisli
Это именно то, что я хочу. Но для примера вам нужно переименовать свой интерфейс (что-то вроде Service, FirstService, SecondService, computeSomeValue) и метода, потому что это немного запутывает, как вы. –