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=
,因为 #
之后的所有内容都将被忽略。
由于我们的 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=
,因为 #
之后的所有内容都将被忽略。