2010-01-20 130 views
1

我有一個運行彈簧應用程序的服務器集羣。一些彈簧組件需要根據其服務器正在播放的角色(主要,次要等)進行不同的配置。我不想爲每個角色維護單獨的spring配置文件,而是希望在應用程序啓動時動態檢測此配置文件。它幾乎就像我想要條件bean實例化(這在春天不存在)。主機/角色相關彈簧配置

問:實現這種配置的最佳方式是什麼?

示例:只有羣集中的主節點應創建對JMS代理的持久訂閱(這需要全局唯一的JMS客戶端ID)。我可以通過在數據庫中查找正在運行的服務器的主機名並手動啓動此容器(如果我的節點碰巧是主要的)來檢測當前主機是否具有此角色。但是,我不希望羣集中的每個節點都創建一個持久訂閱(通過實例化這個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> 

注意,但是沒有$ {服務器的主機名}財產Spring容器(至少我所知道的)

+0

僅供參考 - 在$ {服務器主機名}屬性應該有值=「...」屬性。 – flicken 2010-01-20 20:39:47

回答

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"/> 
+0

是否可以使用單個bean實例來提供值? – Justin 2010-01-20 20:43:43

+0

是的,你可以使用一個singleton bean:添加了PropertyPathFactoryBean的例子。 – flicken 2010-01-20 23:01:12

1

您可以實現有條件的實例化邏輯 爲FactoryBean

+0

通常FactoryBeans用於實現自定義命名空間(比如spring安全性),我不想寫一個框架;我想創建一個使用庫存組件的應用程序。 – Justin 2010-01-20 19:50:52

+0

以普遍的方式分類權利,但接受的答案更好地解釋了它。 – Justin 2010-01-20 20:45:47