Java 如何在Spring中更新@autowiredstringbean的值?

Java 如何在Spring中更新@autowiredstringbean的值?,java,spring,autowired,Java,Spring,Autowired,我有一个字符串,我正在作为bean自动连接。字符串的值通过属性文件设置,并在运行时加载。这是我能证实的。以下是我的XML: <context:property-placeholder location="classpath:my-app.properties" /> <bean id="loadedProp" class="java.lang.String"> <constructor-arg> <value>${loaded-

我有一个字符串,我正在作为bean自动连接。
字符串的值通过属性文件设置,并在运行时加载。这是我能证实的。以下是我的XML:

<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中自动连接。我试图做的是,当应用程序运行时,将bean的值更新为其他值,这样无论bean自动连接到哪里,它都使用最新的值。可以这样做吗,还是每次我想更改值时都需要重新启动?

因为
字符串是不可变的,所以您不能只更改其基础值,然后更新所有引用它的人


您可以更改
Foo
实例保留的
String
的引用,以指向不同的
String
,但它将仅由使用您更新的特定
Foo
的对象实现。如果
Foo
是一个Spring单例,这应该不是一个问题,但是…

每次您想通过更改配置来更改Spring注入值时,您都必须重新启动容器,这通常涉及重新启动服务器。

阅读一些其他答案和注释后,我想出了一个解决办法。我最终创建了一个简单的类:

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>

我相信还有一种更优雅的方式,但这正是我所需要的。

Drat。那么,我是否能够通过自动连接一个以字符串作为属性的类并更新该属性来解决这个问题呢?或者我还会落入同样的陷阱吗?例如,您可以使用apache.commons的MutableObject,并在那里使用getter/setter?这听起来似乎有道理,但我也会看看从评论中得到的一些建议。同样,这取决于您将此
字符串提供给了谁,以及是否使用Spring管理。实际上,您可以使用反射更改字符串的值,但这绝不是一个好主意,因为字符串是内部的,您不知道更改后的值在哪里使用。我最近(在调试期间)错误地将
Boolean.TRUE
的内部值更改为
false
。我想你可以想象很多意想不到的事情在那之后开始发生:-)所以基本上:Java中没有不可变的对象(如果反射可用),但是有些事情不应该改变。这个链接的可能副本可能会帮助你看一看上一篇文章there@beny23啊,谢谢。在我的搜索中没有找到。
<bean id="lPropBean" class="LPropBean">
  <constructor-arg>
    <value>${loaded-prop}</value>
  </constructor-arg>
</bean>
@Autowire
private LPropBean lPropBean;

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

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