如何在Spring中加载系统属性文件?

时间:2010-11-07 06:04:01

标签: java spring spring-mvc

我有一个属性文件,我想加载到系统属性,以便我可以通过System.getProperty("myProp")访问它。目前,我正在尝试使用Spring <context:propert-placeholder/>,如此:

<context:property-placeholder location="/WEB-INF/properties/webServerProperties.properties" />

但是,当我尝试通过System.getProperty("myProp")访问我的媒体资源时,我收到null。我的属性文件如下所示:

myProp=hello world

我怎么能实现这个目标?我很确定我可以设置运行时参数,但是我想避免这种情况。

谢谢!

3 个答案:

答案 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>