具有特定值解析器的PropertySourcesPlaceholderConfigurer

时间:2016-04-01 05:54:01

标签: java spring configuration properties-file

我知道只要它包含对其他属性的引用,${...} - 符号就会起作用。但是,我想扩展该解析算法。

这是属性文件:

connection.http.connectTimeout=15000
#connection.http.readTimeout=${connection.http.connectTimeout}
connection.http.readTimeout=%{30*1000}

第二行仍然可以工作并将readTimeout设置为15000,但我想让第3行工作。我不得不说我不关心我使用的是什么前缀和后缀,上面的例子使用了%{...},但无论如何使它工作都没问题。 ${...}可能是更好的选择,因为已经存在所有必需的解析,但是我的新算法必须在通常的Spring之前启动。

这是我到目前为止所拥有的:

@Configuration
public class BaseAppConfig {

  @Bean
  public static PropertySourcesPlaceholderConfigurer properties(Environment environment) throws IOException {
    String env = getEnvProperty(environment);
    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
    configurer.setLocations(getPropertiesFiles(env));
    configurer.setIgnoreResourceNotFound(true);
    return configurer;
  }

我尝试了一位鸽友PropertySourcesPlaceholderConfigurer,但convertPropertyValue()从未被调用过:

    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer() {

      @Override
      protected String convertPropertyValue(String originalValue) {
        System.out.println("Parse " + originalValue);
        return super.convertPropertyValue(originalValue);
      }

    };

我试着研究一下Spring是如何工作的,它似乎与PropertyResolver一起工作。但是,我不知道如何将其编织成一个。

那我该怎么解决呢?

1 个答案:

答案 0 :(得分:0)

实际上,一旦我知道Spring's RandomValuePropertySource完全符合我的预期,它就会变得非常容易。

几分钟之内,我就可以编写像

这样的花式持续时间配置
connection.connectTimeout=${duration:15s}

缺少的链接是:

  @Bean
  public static PropertySourcesPlaceholderConfigurer properties(Environment environment) throws IOException {
    AbstractEnvironment standardEnvironment = ((AbstractEnvironment) environment);
    MutablePropertySources propertySources = standardEnvironment.getPropertySources();
    propertySources.addLast(new DurationValuePropertySource());
  }