我想在运行时从属性文件中获取更改的键值。
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>
答案 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(原型范围)