我正在尝试从Spring的Environment property abstraction动态访问属性。
我声明我的属性文件:
<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
?
答案 0 :(得分:2)
简单地添加<context:property-placeholder/>
不会向环境添加新的PropertySource。如果您阅读完全链接的文章,您会看到它建议注册ApplicationContextInitializer
以添加新的PropertySource,以便它们以您尝试使用它们的方式提供。
答案 1 :(得分:1)
为了实现这一点,我不得不将属性的读取分解为@Configuration
bean,作为shown here。
以下是完整的示例:
@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;
}
}
然后将这组属性注入其他地方,以供消费。