java Spring重新加载属性Bean未更新
我有一个从应用程序获取属性的Web服务。属性文件通过spring位于类似服务器的查询[testSql]中
public class RuntimeEnvironmentPropertiesConfigurerextends PropertyPlaceholderConfigurer
implements InitializingBean, RuntimeEnvironmentInterface
现在,这个查询被注入到我的Spring bean dao中
<bean id="dao" name="dao" class="com.dao.DaoImpl">
<property name="ackJdbcTemplate" ref="ackJdbcTemplate" />
<property name="testSql" value="${dao.query.tSql}" />
</bean>
在How can I reload properties file in Spring 4 using annotations?link的帮助下,我能够在运行时重新加载属性。 验证人
@Autowired
public RuntimeEnvironmentInterface propertyLoader;
....
Set s=propertyLoader.getProperties();
Iterator itr=s.iterator();
while(itr.hasNext()){
String tempKey=String.valueOf(itr.next());
logger.info(tempKey +"==="+propertyLoader.getProperty(tempKey));
但问题是我的DAOBean不接受更新的testSql查询。在我重新启动应用程序之前,它一直在旧版本上运行
我在单独的url映射中找到了一种类似的方法,我编写了一个方法,它可以完成以下工作:
Dao.setTestSql(propertyLoader.getProperty("com.dao.query.tSql"));
更新的人必须在更新属性后点击url
但我必须为所有的bean和注入属性做这些。这是一项非常繁忙的工作。我错过了一处房产,我注定要失败。 有没有其他方法可以自动更新注入的bean?我需要的是,我的更新后的属性反映没有重新启动
我试图理解给出的wuenschenswert代码,但无法理解
# 1 楼答案
这意味着在bean初始化时,Spring使用名为
dao.query.tSql
的属性计算属性值。所以setTestSql()
方法将在初始化上下文时被调用,仅此而已。重新加载属性时,属性加载器将不会将新属性值推送到bean中但是,正如Alexey所建议的,每次执行sql查询时,都可以从
propertyLoader
中提取属性值,如下所示:有一个问题:当房产数量增加时,这可能会开始看起来很难看。但是,如果您创建一些封装这些访问的类,这可以得到缓解;该类将通过其方法提供属性。例如:
然后在
Dao
中创建该类的实例:然后
还有一点好处:您可以在同一个
DynamicProperties
类中进行类型转换(例如,当您的属性是int
而不是String
)