我正在尝试从Spring的环境属性抽象动态访问属性。
我这样声明我的属性文件:
<context:property-placeholder
location="classpath:server.common.properties,
classpath:server.${my-environment}.properties" />
在我的属性文件server.test.properties
中,我定义了以下内容:
myKey=foo
然后,给定以下代码:
@Component
public class PropertyTest {
@Value("${myKey}")
private String propertyValue;
@Autowired
private PropertyResolver propertyResolver;
public function test() {
String fromResolver = propertyResolver.getProperty("myKey");
}
}
当我运行这段代码时,我最终得到propertyValue='foo'
,但fromResolver=null
;
接收propertyValue
表示正在读取属性,(我从代码的其他部分知道这一点)。但是,尝试动态查找它们是失败的。
为什么?如何动态查找属性值,而不必使用@Value
?
简单地添加<context:property-placeholder/>
并不会向环境添加新的PropertySource。如果你完全阅读了你链接的文章,你会看到它建议注册一个ApplicationContextInitializer
,以便添加新的propertysource,这样它们就可以在你试图使用它们的方式。
为了使其工作,我必须将属性的读取拆分为@Configuration
bean,如下所示。
完整的示例如下:
@Configuration
@PropertySource("classpath:/server.${env}.properties")
public class AngularEnvironmentModuleConfiguration {
private static final String PROPERTY_LIST_NAME = "angular.environment.properties";
@Autowired
private Environment environment;
@Bean(name="angularEnvironmentProperties")
public Map<String,String> getAngularEnvironmentProperties()
{
String propertiesToInclude = environment.getProperty(PROPERTY_LIST_NAME, "");
String[] propertyNames = StringUtils.split(propertiesToInclude, ",");
Map<String,String> properties = Maps.newHashMap();
for (String propertyName : propertyNames)
{
String propertyValue = environment.getProperty(propertyName);
properties.put(propertyName, propertyValue);
}
return properties;
}
}