OSGI蓝图条件参考(ServiceMix)

时间:2018-11-05 19:25:16

标签: reference apache-servicemix blueprint-osgi

我有两个bean,b1b2,还有一个布尔属性myFlagb1b2都需要构造,因为它们在应用程序的不同部分中使用。 b1b2的类层次结构如下:

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仅在b1myFlag时引用false,并且
  • myBean仅在b2myFlag时引用true

以上配置是否可行?如果是这样,需要做些什么才能使它起作用?

注意:我想避免添加其他属性。如果我真的需要加一句话,那不是死刑。无论是否方便,我都需要解决此问题的方法。 myFlag恰好是生产系统中的一个现有属性,因此,如果我可以坚持使用这一属性(与选择哪个bean直接相关),那就更好了。

1 个答案:

答案 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" />