条件弹簧配置

2022-09-03 15:06:15

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

例如,我想定义两个不同的连接器,如下所示:

连接器 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>

答案 1

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

<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定义配置文件,但您必须在JVM中传递系统属性。我试图避免这种情况,在上面的方法中,您没有麻烦设置任何JVM系统属性。-Dspring.profiles.active


答案 2

另一种替代方法:Bean 定义配置文件。在 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"

推荐