如何使用spring在运行时从属性文件中获取键值

时间:2015-02-28 19:50:01

标签: spring spring-security

我想在运行时从属性文件中获取更改的键值。

test.properties文件: name = Hi

我让线程睡眠时间为5秒,并将键值更改为“Hello”,但它没有被更改。

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:test.properties</value>
        </list>
    </property> 
    <property name="ignoreResourceNotFound" value="true" />
    <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>classpath:test</value>
        </list>
    </property>
    <property name="cacheSeconds" value="1" />
</bean>

<bean id="tempBean" name="tempBean1" class="org.sri.spring.temp.Temp"
    lazy-init="false" scope="prototype">
    <constructor-arg type="String" value="${name}" />
</bean> 

2 个答案:

答案 0 :(得分:0)

使用${name}解析XML配置中的PropertySourcesPlaceholderConfigurer占位符,正如您可能已经注意到的那样, 与您的可重新加载的messageSource相同。 它不会以任何方式工作,因为Spring只实例化tempBean一次:在应用程序启动时,通过将${name}的值传递给构造函数。 bean本身不知道值来自何处(特别是,它不关心属性文件是否被编辑)。

如果真的认为这样做是个好主意†,您可以将整个messageSource注入tempBean,并在每次通话中获取当前值,例如:

public class Temp {
  @Autowired // or wired in XML, constructor, etc.
  private MessageSource messages;

  public String sayHello() {
    return messages.getMessage("name", null, Locale.getDefault());
  }
}

†注入与配置相关的对象会使测试更加困难,并且可以说是糟糕的设计(混合问题)。看看Spring Cloud Config项目,因为这可能是未来的样子。

答案 1 :(得分:-1)

我不认为Spring会在属性发生变化时更新已有的bean。

尝试创建一个新bean(原型范围)