Spring Reload属性 - Bean未更新

时间:2017-06-21 16:18:51

标签: java spring properties spring-bean

我有一个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代码,但却无法理解。

1 个答案:

答案 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时)。