2015-07-05 4 views
1

Я использую Spring 4.1.6. у меня есть что-то вроде следующего:Использование пружины для загрузки свойств как свойств системы

foo.properties:

valueX=a 
valueY=b 

Весна фасоли:

<context:property-placeholder location="classpath:foo.properties" ignore-unresolvable="false" ignore-resource-not-found="false" /> 

    <bean id="foo" class="com.foo.bar.MyClass" > 
     <property name="someValue" value="${valueX}" /> 
    </bean> 

У меня есть класс не-Spring, которые также необходимо использовать значение из foo.properties.

Non Spring Класс:

public void doSomething() { 
    String valueY = System.getProperty("valueY"); 
} 

Когда весна нагружает foo.properties, есть способ, чтобы заполнить все свойства в систему свойств, так что я могу получить "valueY" с помощью System.getProperty (» valueY ").

Я не хочу снова загружать foo.properties в мой класс non-Spring.

+0

Как насчет этого? http://stackoverflow.com/questions/3339736/set-system-property-with-spring-configuration-file – ArunM

ответ

0

context:property-placeholder создаст конфигурационный компонент PropertySourcesPlaceholderConfigurer. Вы не можете обращаться к свойствам из этого компонента программно, как указано here.

Что вы можете сделать, это загрузить свойства в отдельный весенний боб, как указано ниже.

@Bean(name = "mapper") 
public PropertiesFactoryBean mapper() { 
    PropertiesFactoryBean bean = new PropertiesFactoryBean(); 
    bean.setLocation(new ClassPathResource("application.properties")); 
    return bean; 
} 

, а затем установить системное свойство, когда загрузка контекста завершена с использованием слушателя, как указано ниже. Получил код от этого answer

@Component 
public class YourJobClass implements ApplicationListener<ContextRefreshedEvent> { 

    @Resource(name = "mapper") 
    private Properties myTranslator; 

    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { 
     System.setProperties(myTranslator); 
    } 
} 
Смежные вопросы