我有一个属性文件,我想加载到系统属性,以便我可以通过System.getProperty("myProp")
访问它。目前,我正在尝试使用Spring <context:propert-placeholder/>
,如此:
<context:property-placeholder location="/WEB-INF/properties/webServerProperties.properties" />
但是,当我尝试通过System.getProperty("myProp")
访问我的媒体资源时,我收到null
。我的属性文件如下所示:
myProp=hello world
我怎么能实现这个目标?我很确定我可以设置运行时参数,但是我想避免这种情况。
谢谢!
答案 0 :(得分:17)
在Spring 3中,您可以通过以下方式加载系统属性:
<bean id="systemPropertiesLoader"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" value="#{@systemProperties}" />
<property name="targetMethod" value="putAll" />
<property name="arguments">
<util:properties location="file:///${user.home}/mySystemEnv.properties" />
</property>
</bean>
答案 1 :(得分:10)
重点是反过来 - 即在spring中使用系统属性,而不是在系统中使用spring属性。
使用PropertyPlaceholderConfigurer
,您可以通过${property.key}
语法获取属性+系统属性。在Spring 3.0中,您可以使用@Value
注释注入这些注释。
这个想法不是依赖于对System.getProperty(..)
的调用,而是依赖于注入属性值。所以:
@Value("${foo.property}")
private String foo;
public void someMethod {
String path = getPath(foo);
//.. etc
}
而不是
public void someMethod {
String path = getPath(System.getProperty("your.property"));
//.. etc
}
想象一下,您想要对您的类进行单元测试 - 您必须使用属性预填充System
对象。使用spring-way,你只需要设置对象的一些字段。
答案 2 :(得分:9)
当我订阅Bozho's answer精神时,我最近还遇到了需要从Spring设置系统属性的情况。这是我提出的课程:
Java代码:
public class SystemPropertiesReader{
private Collection<Resource> resources;
public void setResources(final Collection<Resource> resources){
this.resources = resources;
}
public void setResource(final Resource resource){
resources = Collections.singleton(resource);
}
@PostConstruct
public void applyProperties() throws Exception{
final Properties systemProperties = System.getProperties();
for(final Resource resource : resources){
final InputStream inputStream = resource.getInputStream();
try{
systemProperties.load(inputStream);
} finally{
// Guava
Closeables.closeQuietly(inputStream);
}
}
}
}
Spring配置:
<bean class="x.y.SystemPropertiesReader">
<!-- either a single .properties file -->
<property name="resource" value="classpath:dummy.properties" />
<!-- or a collection of .properties file -->
<property name="resources" value="classpath*:many.properties" />
<!-- but not both -->
</bean>