PropertySourcesPlaceholderConfigurer 和 SpEL?

PropertySourcesPlaceholderConfigurer and SpEL?

由于我们的 properties 文件设置相当复杂,我们不能简单地使用 @PropertySource.

这是属性文件:

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

第二行仍然有效并将 readTimeout 设置为 15000,但是第三行就位时该值仅为 0。

豆子类:

@Component
@ConfigurationProperties("connection")
public class ConnectionConfig {

  @NestedConfigurationProperty
  private ConnectionSourceConfig http;

  public ConnectionSourceConfig getHttp() {
    return http;
  }

  public void setHttp(ConnectionSourceConfig http) {
    this.http = http;
  }

}

public class ConnectionSourceConfig {

  private long connectTimeout;

  private long readTimeout;

  public long getConnectTimeout() {
    return connectTimeout;
  }

  public void setConnectTimeout(long connectTimeout) {
    this.connectTimeout = connectTimeout;
  }

  public long getReadTimeout() {
    return readTimeout;
  }

  public void setReadTimeout(long readTimeout) {
    this.readTimeout = readTimeout;
  }

}

使用 PropertySourcesPlaceholderConfigurer 似乎会阻止 SpEL 工作:

@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 一起工作。但是,我不知道如何将其编织到其中。

但是,也许我在 Spring 的处理生命周期方面犯了一个错误...

在属性文件方面,# 被视为注释块。这样做,您的 属性 文件以 属性 被设置为空结束。

connection.http.readTimeout=#{30*1000} 呈现为 connection.http.readTimeout=,因为 # 之后的所有内容都将被忽略。