【问题标题】:How do I update the value of an @Autowired String bean in Spring?如何在 Spring 中更新 @Autowired String bean 的值?
【发布时间】:2012-02-09 15:40:19
【问题描述】:

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

【问题讨论】:

标签: java spring autowired


【解决方案1】:

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

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 中自动装配的所有 @Components:

@Autowire
private LPropBean lPropBean;

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

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

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

【讨论】:

  • setLoadedPropgetLoadedPropLPropBean 类中的位置在哪里?
  • @Andus 他们在 getter 和 setter 部分。在这种情况下,我没有为示例编写它们。
  • 啊,我明白了,我是 Java Spring 新手,感谢您的解释@Pat
【解决方案2】:

由于String 是不可变的,您不能只更改它的基础值并让所有引用它的人都更新。

您可以更改Foo 的实例所持有的String 的引用以指向不同的String,但它只能由与特定Foo 合作的对象实现更新。如果 Foo 是 Spring 单例,那么这应该不是问题......

【讨论】:

  • 德拉特。那么我可以通过自动装配一个具有 String 作为属性的类并更新该属性来解决这个问题吗?还是我还是会落入同样的陷阱?
  • 例如,您可以使用 apache.commons 的 MutableObject 并在那里使用 getter/setter 吗?
  • 这听起来很合理,但我也会看看来自 cmets 的一些建议。同样,这取决于您将此String 提供给谁以及是否由 Spring 管理。
  • 实际上,您可以使用反射来更改字符串的值,但这绝不是一个好主意,因为字符串是实习的,您不知道更改的值在哪里用来。我最近(在调试期间)错误地将Boolean.TRUE 的内部值更改为false。我想你可以想象,在那之后很多意想不到的事情开始发生了 :-) 所以基本上:在 Java 中没有不可变对象之类的东西(如果反射可用),但有些事情 应该不可更改
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2018-10-04
    • 2019-06-08
    相关资源
    最近更新 更多