条件弹簧配置

时间:2014-05-26 14:42:27

标签: java spring

是否可以在Spring配置中使用条件表达式?

E.g。我想定义两个不同的连接器:

连接器1:

<spring:bean id="MyConnector" class="org.test.provider.DBConnector">
    <spring:property name="host" value="${my.config.host}"/>
    <spring:property name="user" value="${my.config.user}"/>
    <spring:property name="password" value="${my.config.password}"/>
</spring:bean>

连接器2:

<spring:bean id="MyConnector" class="org.test.provider.FileSystemConnector">
    <spring:property name="path" value="${my.config.path}"/>
</spring:bean>

然后,稍后使用以下其中一个:

<spring:bean id="LookupCommand" class="org.test.lookup.LookupCommand"
    scope="prototype">
    <spring:property name="connector" ref="MyConnector"/>
</spring:bean>

依赖于我的.cfg文件中的${my.config.connectorType},我想选择/激活其中一个:

if ${my.config.connectorType} == DB then

    <spring:bean id="MyConnector" class="org.test.provider.DBConnector">
        <spring:property name="host" value="${my.config.host}"/>
        <spring:property name="user" value="${my.config.user}"/>
        <spring:property name="password" value="${my.config.password}"/>
    </spring:bean>

else

    <spring:bean id="MyConnector" class="org.test.provider.FileSystemConnector">
        <spring:property name="path" value="${my.config.path}"/>
    </spring:bean>
end
...
<spring:bean id="LookupCommand" class="org.test.lookup.LookupCommand"
    scope="prototype">
    <spring:property name="connector" ref="MyConnector"/>
</spring:bean>

4 个答案:

答案 0 :(得分:4)

一种简单的替代解决方案。为每个连接器指定不同的名称,如下所示

<spring:bean id="dbConnector" class="org.test.provider.DBConnector">
    <spring:property name="host" value="${my.config.host}"/>
    <spring:property name="user" value="${my.config.user}"/>
    <spring:property name="password" value="${my.config.password}"/>
</spring:bean>

<spring:bean id="fileConnector" class="org.test.provider.FileSystemConnector">
    <spring:property name="path" value="${my.config.path}"/>
</spring:bean>

在属性文件中,指定要连接的连接器的名称,例如my.config.connectorType = dbConnector

在LookupCommand bean中,请按以下方式引用此属性

<spring:bean id="LookupCommand" class="org.test.lookup.LookupCommand"
    scope="prototype">
    <spring:property name="connector" ref="${my.config.connectorType}"/>
</spring:bean>

注意:我最初想过建议bean definition profile,但您必须在JVM中传递系统属性-Dspring.profiles.active。我试图避免这种情况,在上面的方法中,您没有麻烦来设置任何JVM系统属性。

答案 1 :(得分:3)

另一种替代方法:Bean definition profiles。在XML文件中包含这些嵌套的<beans>元素:

<beans profile="db1">
    <bean id="MyConnector" ...>
        ...
    </bean>
</beans>

<beans profile="db2">
    <bean id="MyConnector" ...>
        ...
    </bean>
</beans>

并将spring.profiles.active添加到您的环境变量中:

-Dspring.profiles.active="db1"

答案 2 :(得分:1)

只需创建2个不同的属性文件。假设他们的名字为DB.propertiesfilesystem.properties。之后使用property-placeholder,您可以通过以下方式引用您的属性文件:

 <context:property-placeholder location="classpath*:META-INF/config/${my.config.connectorType}.properties"/>

如果使用'-Dmy.config.connectorType = DB'JVM参数启动应用程序,则将加载DB.properties文件。

<spring:bean id="MyDbConnector" class="org.test.provider.DBConnector" lazy-init="true">
    <spring:property name="host" value="${my.config.host}"/>
    <spring:property name="user" value="${my.config.user}"/>
    <spring:property name="password" value="${my.config.password}"/>
</spring:bean>

<spring:bean id="MyFileSystemConnector" class="org.test.provider.FileSystemConnector" lazy-init="true">
    <spring:property name="path" value="${my.config.path}"/>
</spring:bean>

<alias name="${my.connector}" alias="MyConnector"/>

<spring:bean id="LookupCommand" class="org.test.lookup.LookupCommand"
scope="prototype">
    <spring:property name="connector" ref="MyConnector"/>
</spring:bean>

DB.properties
    my.connector = MyDbConnector
filesystem.properties
    my.connector = MyFileSystemConnector

答案 3 :(得分:1)

对于仍在寻找解决方案的人,我觉得this是一个最接近所需行为的答案 - 在bean定义中使用三元运算符。