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

时间:2012-02-09 15:40:19

标签: java spring autowired

我有一个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自动装配的任何地方,它使用最新的值。是否可以这样做,或者我只是需要在每次想要更改值时重新启动?

3 个答案:

答案 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)

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