Как загрузить файл системных свойств в Spring? - PullRequest
8 голосов
/ 07 ноября 2010

У меня есть файл свойств, который я хотел бы загрузить в Свойства системы, чтобы я мог получить к нему доступ через System.getProperty("myProp"). В настоящее время я пытаюсь использовать Spring <context:propert-placeholder/> примерно так:

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

Однако, когда я пытаюсь получить доступ к своим свойствам через System.getProperty("myProp"), я получаю null. Мой файл свойств выглядит так:

myProp=hello world

Как я мог этого добиться? Я почти уверен, что смогу установить аргумент времени выполнения, однако я бы хотел этого избежать.

Спасибо!

Ответы [ 3 ]

17 голосов
/ 26 октября 2011

В 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>
10 голосов
/ 07 ноября 2010

Смысл в том, чтобы сделать это наоборот - т.е. использовать системные свойства пружины, а не пружинные свойства в системе.

С PropertyPlaceholderConfigurer вы получаете свои свойства + системные свойства, доступные через${property.key} синтаксис.Весной 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 свойствами.При использовании пружины вам просто нужно установить несколько полей объекта.

9 голосов
/ 07 ноября 2010

Пока я подписываюсь на ответ духа Божо , у меня недавно также возникла ситуация, когда мне нужно было установить системные свойства из 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 Config:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...