如何在Spring中更新@Autowired String bean的值?

我有一个String,我将自动assembly为bean。 String的值通过属性文件设置,并在运行时加载。 我可以validation这一点。 这是我的XML:

    ${loaded-prop}   

在我的应用程序中,我在bean中自动assembly:

 @Component public class Foo { @Autowired private String loadedProp; } 

一切都很花哨。 我有多个组件在这个bean中自动assembly。 我正在尝试做的是,在应用程序运行时,将bean的值更新为其他内容,以便在bean自动assembly的任何地方,它使用最新的值。 是否可以这样做,或者我只是需要在每次想要更改值时重新启动?

由于String是不可变的,因此您不仅可以更改其基础值,还可以更新每个引用它的人。

您可以更改Foo实例所持有的String的引用以指向不同的String ,但只能通过使用您更新的特定Foo对象来实现。 如果Foo是一个Spring单例,这应该不是问题,但……

在阅读了一些其他答案和评论后,我能够找到解决方案。 我最终创建了一个简单的类:

 public class LPropBean { private String loadedProp; public LPropBean(String loadedProp) { this.loadedProp = loadedProp; } // getters and setters... } 

我更新了我的XML文件:

   ${loaded-prop}   

并更新了在bean中自动assembly的所有@Component

 @Autowire private LPropBean lPropBean; // ... later ... lPropBean.setLoadedProp(newProp); // ... later ... lPropBean.getLoadedProp(); 

我确信有更优雅的方式,但这完全符合我的需要。

每次您想通过更改配置来更改弹簧注入值时,您将不得不重新启动容器,这通常涉及重新启动服务器。