我有两个bean,b1
和b2
,还有一个布尔属性myFlag
。 b1
和b2
都需要构造,因为它们在应用程序的不同部分中使用。 b1
和b2
的类层次结构如下:
interface MyFirstInterface { ... }
class B1Class implements MyFirstInterface { ... }
interface MySecondInterface extends MyFirstInterface { ... }
class B2Class implements MySecondInterface { ... }
在我的第一个蓝图文件中,我有:
<service id="b1" interface="com.company.MyFirstInterface">
<bean class="com.company.B1Class" />
</service>
<service id="b2" interface="com.company.MySecondInterface">
<bean class="com.company.B2Class" />
</service>
在我的第二个蓝图文件中,我有:
<cm:property-placeholder persistent-id="com.company.settings" update-strategy="reload">
<cm:default-properties>
<cm:property name="myFlag"/>
</cm:default-properties>
</cm:property-placeholder>
<reference id="myBean" interface="com.company.MyFirstInterface">
假设我要
myBean
仅在b1
为myFlag
时引用false
,并且myBean
仅在b2
为myFlag
时引用true
。以上配置是否可行?如果是这样,需要做些什么才能使它起作用?
注意:我想避免添加其他属性。如果我真的需要加一句话,那不是死刑。无论是否方便,我都需要解决此问题的方法。 myFlag
恰好是生产系统中的一个现有属性,因此,如果我可以坚持使用这一属性(与选择哪个bean直接相关),那就更好了。
答案 0 :(得分:0)
万一其他人遇到这种情况,让我发布我们想出的解决方案。
创建两个bean
<bean id="b1" class="com.company.B1Class" />
<bean id="b2" class="com.company.B2Class" />
创建工厂类
public class MyFactoryClass {
private boolean myFlag;
private B1Class b1;
private B2Class b2;
public MyFactoryClass(boolean myFlag, B1Class b1, B2Class b2) {
this.myFlag = myFlag;
this.b1 = b1;
this.b2 = b2;
}
public MyFirstInterface buildIt() {
return myFlag ? b2 : b1;
}
}
将工厂类定义为bean,并使用它来选择类
<bean id="myFactory" class="com.company.MyFactoryClass">
<argument value="${myFlag}"/>
<argument ref="b1"/>
<argument ref="b2"/>
</bean>
<bean id="myBean" factory-ref="myFactory" factory-method="buildIt" />
<service id="myBean" interface="com.company.MyFirstInterface" />
完整蓝图
第一个蓝图:
<cm:property-placeholder persistent-id="com.company.settings" update-strategy="reload">
<cm:default-properties>
<cm:property name="myFlag"/>
</cm:default-properties>
</cm:property-placeholder>
<bean id="b1" class="com.company.B1Class" />
<bean id="b2" class="com.company.B2Class" />
<bean id="myFactory" class="com.company.MyFactoryClass">
<argument value="${myFlag}"/>
<argument ref="b1"/>
<argument ref="b2"/>
</bean>
<bean id="myBean" factory-ref="myFactory" factory-method="buildIt" />
<service id="myBean" interface="com.company.MyFirstInterface" />
第二个蓝图:
<reference id="myBean" interface="com.company.MyFirstInterface" />