Spring 占位符不解析 JavaConfig 中的属性
Spring placeholder doesn't resolve properties in JavaConfig
目前我有一个 Spring xml 配置 (Spring 4),它加载了一个属性文件。
context.properties
my.app.service = myService
my.app.other = ${my.app.service}/sample
Springxml配置
<bean id="contextProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="ignoreResourceNotFound" value="true" />
<property name="fileEncoding" value="UTF-8" />
<property name="locations">
<list>
<value>classpath:context.properties</value>
</list>
</property>
</bean>
<bean id="placeholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true" />
<property name="properties" ref="contextProperties" />
<property name="nullValue" value="@null" />
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
</bean>
使用属性
的Bean
@Component
public class MyComponent {
@Value("${my.app.other}")
private String others;
}
这非常有效,others
值为 MyService/sample
,例外情况。但是,当我尝试用 JavaConfig 替换此配置时,组件中的 @Value
不会以相同的方式工作。该值不是 myService/sample
,而是 ${my.app.service}/sample
。
@Configuration
@PropertySource(name="contextProperties", ignoreResourceNotFound=true, value={"classpath:context.properties"})
public class PropertiesConfiguration {
@Bean
public static PropertyPlaceholderConfigurer placeholder() throws IOException {
PropertyPlaceholderConfigurer placeholder = new PropertyPlaceholderConfigurer();
placeholder.setNullValue("@null");
placeholder.setSystemPropertiesMode(PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE);
return placeholder;
}
}
在从 xml 到 Javaconfig 的转换过程中我错过了什么吗?
ps :我也尝试实例化 PropertySourcesPlaceholderConfigurer
而不是 PropertyPlaceholderConfigurer
但没有更多成功。
更新以使用配置 PropertySourcesPlaceholderConfigurer
。仅仅有 @PropertySource
注释是不够的:
@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
return new PropertySourcesPlaceholderConfigurer();
}
@PropertySource
注释不会自动将 PropertySourcesPlaceholderConfigurer
注册到 Spring。因此我们需要显式配置 PropertySourcesPlaceholderConfigurer
下面的 JIRA 票有更多关于此设计背后的基本原理的信息:
https://jira.spring.io/browse/SPR-8539
更新:
创建了简单的 Spring 引导应用程序以使用嵌套属性。上面的配置工作正常。
https://github.com/mgooty/property-configurer/tree/master/complete
另一种选择是导入 PropertyPlaceholderAutoConfiguration.class。
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
@Import(PropertyPlaceholderAutoConfiguration.class)
注释在上下文中包含 PropertySourcesPlaceholderConfigurer(如果它不存在)。
目前我有一个 Spring xml 配置 (Spring 4),它加载了一个属性文件。
context.properties
my.app.service = myService
my.app.other = ${my.app.service}/sample
Springxml配置
<bean id="contextProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="ignoreResourceNotFound" value="true" />
<property name="fileEncoding" value="UTF-8" />
<property name="locations">
<list>
<value>classpath:context.properties</value>
</list>
</property>
</bean>
<bean id="placeholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true" />
<property name="properties" ref="contextProperties" />
<property name="nullValue" value="@null" />
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
</bean>
使用属性
的Bean@Component
public class MyComponent {
@Value("${my.app.other}")
private String others;
}
这非常有效,others
值为 MyService/sample
,例外情况。但是,当我尝试用 JavaConfig 替换此配置时,组件中的 @Value
不会以相同的方式工作。该值不是 myService/sample
,而是 ${my.app.service}/sample
。
@Configuration
@PropertySource(name="contextProperties", ignoreResourceNotFound=true, value={"classpath:context.properties"})
public class PropertiesConfiguration {
@Bean
public static PropertyPlaceholderConfigurer placeholder() throws IOException {
PropertyPlaceholderConfigurer placeholder = new PropertyPlaceholderConfigurer();
placeholder.setNullValue("@null");
placeholder.setSystemPropertiesMode(PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE);
return placeholder;
}
}
在从 xml 到 Javaconfig 的转换过程中我错过了什么吗?
ps :我也尝试实例化 PropertySourcesPlaceholderConfigurer
而不是 PropertyPlaceholderConfigurer
但没有更多成功。
更新以使用配置 PropertySourcesPlaceholderConfigurer
。仅仅有 @PropertySource
注释是不够的:
@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
return new PropertySourcesPlaceholderConfigurer();
}
@PropertySource
注释不会自动将 PropertySourcesPlaceholderConfigurer
注册到 Spring。因此我们需要显式配置 PropertySourcesPlaceholderConfigurer
下面的 JIRA 票有更多关于此设计背后的基本原理的信息:
https://jira.spring.io/browse/SPR-8539
更新: 创建了简单的 Spring 引导应用程序以使用嵌套属性。上面的配置工作正常。
https://github.com/mgooty/property-configurer/tree/master/complete
另一种选择是导入 PropertyPlaceholderAutoConfiguration.class。
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
@Import(PropertyPlaceholderAutoConfiguration.class)
注释在上下文中包含 PropertySourcesPlaceholderConfigurer(如果它不存在)。