Получить Spring Environment как свойства

Интересно, есть ли способ извлечь свойства из среды Spring (например, полученные из ApplicationContext) в виде экземпляра Properties? Или, по крайней мере, есть ли способ перечислить свойства в Spring Environment, или получить их все в виде карты, или каким-либо другим способом я могу превратить [изначально неизвестный] набор свойств в объект Properties?

Мне нужно это для того, чтобы создать jclouds Context позвонив org.jclouds.ContextBuilder.newBuilder() а также .overrides(Properties), Идея состоит в том, чтобы сконфигурировать реального поставщика облачных вычислений исключительно с помощью файла.properties, и я не хочу связывать логику приложения со свойствами, специфичными для поставщика.

[ОБНОВИТЬ]

Используемые файлы.properties настраиваются с помощью <context:property-placeholder>и он фактически указывает список путей, например так:

< context:property-placeholder location=
    "classpath:/jdbc.properties,
    file:${jboss.server.config.dir}/jdbc.properties,
    file:${catalina.home}/conf/jdbc.properties"
    ignore-resource-not-found="true"/>

что говорит о том, что файл.properties ищется в указанном списке мест по порядку. Я хотел бы добиться следующего:

  • храните список файлов.properties и их возможные местоположения только в этом файле определения XML;
  • позволяют размещать связанные свойства jclouds в любом из файлов.properties, упомянутых в XML;
  • получить доступ к свойствам, разрешенным и загруженным Spring, в форме объекта Properties, поэтому я могу передать его в jclouds ContextBuilder,

Пожалуйста, дайте мне знать, если все это возможно. Заранее спасибо!

-Vlad

2 ответа

Если вы не хотите использовать свойства в конфигурации Spring, вы можете просто использовать:

<context:property-placeholder location="classpath:foo.properties" />

Чтобы получить свойства в вашем коде позже, вы можете просто прочитать этот файл из classpath в объект Properties:

props.load(MyClass.class.getClassLoader().getResourceAsStream("foo.properties"));

В качестве альтернативы вы можете взглянуть на PropertyPlaceholderConfigurer.

ОБНОВИТЬ

Обновляется после замечания Deinum, но только если вы получаете свойства из управляемого бина Spring:

<util:properties id="myProps" 
           location="classpath:foo.properties"/>
<context:property-placeholder properties-ref="myProps" />

Теперь вы можете внедрить myProps в управляемые bean-компоненты Spring (нет необходимости загружать их снова из пути к классам).

Вы можете использовать PropertiesFactoryBean и сделать что-то вроде этого:

<bean id="jcloudsProps" 
    class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="location">
    <value>your/props/file.properties</value>
  </property>
</bean>

Вы можете использовать jcloudsProps как и любой другой весенний боб.

Другие вопросы по тегам