有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    <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