我有一个String,我将自动装配为bean。 String
的值是通过属性文件设置的,并在运行时加载。我可以验证这一点。这是我的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中自动装配:
@Component
public class Foo {
@Autowired
private String loadedProp;
}
一切都很有用。我有多个组件在这个bean中自动装配。我正在尝试做的是,在应用程序运行时,将bean的值更新为其他内容,以便在bean自动装配的任何地方,它使用最新的值。是否可以这样做,或者我只是需要在每次想要更改值时重新启动?
答案 0 :(得分:3)
由于String
是不可变的,因此您不仅可以更改其基础值,还可以更新每个引用它的人。
您可以更改String
实例所持有的Foo
的引用,以指向不同的String
,但只能通过正在使用的对象来实现您更新的具体Foo
。如果Foo
是一个Spring单例,那么这应该不是问题......
答案 1 :(得分: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>
并更新了bean中自动装配的所有@Component
:
@Autowire
private LPropBean lPropBean;
// ... later ...
lPropBean.setLoadedProp(newProp);
// ... later ...
lPropBean.getLoadedProp();
我确信有更优雅的方式,但这正是我需要的方式。
答案 2 :(得分:0)
每次您想通过更改配置来更改弹簧注入值时,您将不得不重新启动容器,这通常涉及重新启动服务器。