我有一个webservice,它从位于服务器中的application.properties文件中获取属性,如查询[testSql]到spring
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?链接的帮助下,我可以在运行时重新加载该属性。
验证@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));
但问题是我的dao bean没有更新的testSql查询。它在旧版本上运行,直到我重新启动应用程序。
我找到了一种方法,就像在单独的url映射中一样,我编写了一个低于作业的方法:
Dao.setTestSql(propertyLoader.getProperty("com.dao.query.tSql"));
并且正在更新的人必须在更新房产后点击网址。
但是我必须为所有的豆和注入的财产做。这是相当繁忙的工作。我想念一个属性,我注定要失败。 有没有其他方法可以自动更新注入的bean?我需要反映我的更新属性而不重新启动。
我试图理解给出的wuenschenswert代码,但却无法理解。
答案 0 :(得分:2)
<property name="testSql" value="${dao.query.tSql}" />
这意味着在bean初始化时,Spring使用名为dao.query.tSql
的属性计算属性值。因此,在初始化上下文时将调用setTestSql()
方法,这就是全部。重新加载属性后,属性加载器不会将新属性值推送到bean中。
但是,正如Alexey建议的那样,每次执行这样的SQL查询时,你都可以从propertyLoader
拉属性值:
final String actualQuery = propertyLoader.getProperty("com.dao.query.tSql");
executeQuery(actualQuery);
存在一个问题:当属性数量增加时,这可能会开始变得难看。但是如果你创建一个封装这些访问的类,这可以减轻;该类将通过其方法提供属性。例如:
public class DynamicProperties {
private final RuntimeEnvironmentInterface propertyLoader;
public DynamicProperties(RuntimeEnvironmentInterface propertyLoader) {
this.propertyLoader = propertyLoader;
}
public String tSql() {
return propertyLoader.getProperty("dao.query.tSql");
}
... other methods for other properties
}
然后在Dao
:
private DynamicProperties dynamicProperties = new DynamicProperties(propertyLoader);
然后
executeQuery(dynamicProperties.tSql());
一点奖励:您可以在同一DynamicProperties
课程中进行类型转换(例如,当您的媒体资源为int
而不是String
时)。