我有一个运行spring应用程序的服务器集群。某些弹簧组件需要根据其服务器所扮演的角色(主要,辅助等)进行不同的配置。我不想为每个角色维护单独的spring配置文件,而是希望在应用程序启动时动态检测它。它几乎就像我想要条件bean实例化(春天不存在)。
问:实现此类配置的最佳方式是什么?
示例:只有集群中的主节点才能创建对JMS代理的持久订阅(这需要全局唯一的JMS clientID)。我可以通过在数据库中查找正在运行的服务器的主机名来检测当前主机是否具有此角色,并手动启动此容器(如果我的节点恰好是主节点);但是,我不希望集群中的每个节点都创建一个持久的订阅(通过实例化这个bean)。
<bean id="auditrecordListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="concurrentConsumers" value="1" />
<property name="clientID" value="${server-hostname}" />
<property name="durable" value="true" />
<!-- only started on the primary node: via application listener -->
<property name="autoStartup" value="false" />
</bean>
注意,弹簧容器中没有$ {server-hostname}属性(至少我知道)
答案 0 :(得分:1)
如果您的代码已经有条件地基于对象属性启动了相应的服务,您可以通过以下方式使用实用程序方法:
<!-- Factory methods to determine properties -->
<bean id="hostname" class="MyUtil" factory-method="determineHostName"/>
<bean id="isHost" class="MyUtil" factory-method="isHost"/>
<bean id="auditrecordListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="concurrentConsumers" value="1" />
<property name="durable" value="true" />
<!-- Reference properties here -->
<property name="hostname" ref="hostname" />
<property name="autoStartup" ref="isHost" />
</bean>
要使用单例bean的属性,请使用PropertyPathFactoryBean:
<bean id="config" class="MyConfig"/>
<util:property-path id="hostname" path="config.hostname"/>
<util:property-path id="isHost" path="config.host"/>