是否可以在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>
答案 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.properties
和filesystem.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定义中使用三元运算符。