2012-02-09 18 views
8

我有一個字符串,我自動裝配成一個bean。 String的值通過屬性文件設置,並在運行時加載。我可以驗證那麼多。這裏是我的XML:如何在Spring中更新@Autowired String bean的值?

<context:property-placeholder location="classpath:my-app.properties" /> 

<bean id="loadedProp" class="java.lang.String"> 
    <constructor-arg> 
     <value>${loaded-prop}</value> 
    </constructor-arg> 
</bean> 

而在我的申請,我在bean自動裝配:

@Component 
public class Foo { 

    @Autowired 
    private String loadedProp; 
} 

一切工作的花花公子。我有多個在這個bean中自動裝配的組件。我試圖做的是,當應用程序正在運行時,將bean的值更新爲其他值,以便隨處自動裝入bean,它使用最新的值。是否有可能做到這一點,或者我每次需要重新啓動才需要更改值?

+0

可能的重複http://stackoverflow.com/questions/2008175/apply-dynamic-properties-to-a-bean-at-runtime – beny23 2012-02-09 15:57:27

+0

此鏈接可能會幫助你http://forum.springsource.org/archive /index.php/t-37557.html看看最後的帖子 – 2012-02-09 15:58:55

+0

@ beny23嗯,謝謝。這在我的搜索中沒有出現。 – Pat 2012-02-09 16:00:29

回答

3

在閱讀了其他一些答案和評論之後,我找到了一個解決方案。我結束了創建一個簡單的類:

public class LPropBean { 

    private String loadedProp; 

    public LPropBean(String loadedProp) { 
     this.loadedProp = loadedProp; 
    } 

    // getters and setters... 
} 

我更新了我的XML文件:

<bean id="lPropBean" class="LPropBean"> 
    <constructor-arg> 
    <value>${loaded-prop}</value> 
    </constructor-arg> 
</bean> 

並更新所有@Component s表示自動裝配的bean的:

@Autowire 
private LPropBean lPropBean; 

// ... later ... 
lPropBean.setLoadedProp(newProp); 

// ... later ... 
lPropBean.getLoadedProp(); 

我我確定有一種更優雅的方式,但這種方式正是我需要它的方式。

3

由於String是不可變的,因此您不能只更改其基礎值,並讓每個有參考的人都更新。

您可以更改的Foo一個實例抓着指向一個不同StringString的參考,但它只能通過與該特定Foo你更新工作對象來實現。如果Foo是一個Spring單例,這不應該成爲一個問題,雖然...

+0

Drat。所以我能夠通過自動裝配一個具有String作爲屬性的類並更新該屬性來解決此問題?或者我還會陷入同一陷阱? – Pat 2012-02-09 15:53:24

+0

例如,你可以使用apache.commons的MutableObject,並在那裏使用getter/setter? – 2012-02-09 16:03:45

+0

這聽起來似乎合理,但我也會看看一些來自評論的建議。同樣,這取決於你是否給了這個'String'以及是否管理了Spring。 – 2012-02-09 16:15:17

0

每當你想通過改變配置改變你的彈簧注入值,你將不得不重新啓動你的容器,通常涉及到重新啓動您的服務器。