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

Интересно, есть ли способ извлечь свойства из Spring Environment (например, полученные из ApplicationContext) в виде экземпляра свойств? Или, по крайней мере, есть ли способ перечислить свойства в 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.

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

-Влад


person Vlad.Z    schedule 02.12.2014    source источник


Ответы (2)


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

<context:property-placeholder location="classpath:foo.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 (нет необходимости загружать их снова из пути к классам).

person Stijn Geukens    schedule 02.12.2014
comment
Зачем так сложно. Вы можете просто использовать <util:properties /> для чтения свойств, которые, в свою очередь, также могут быть введены в элемент <context:property-placeholder />. Спасает от загрузки файла дважды. - person M. Deinum; 02.12.2014
comment
Deinum, вы правы, но это будет работать только с управляемыми компонентами Spring. Поскольку ОП, похоже, сам создает этот объект (newBuilder()), это не сработает. - person Stijn Geukens; 02.12.2014
comment
Ему нужны свойства, которые должны быть введены, как они читаются, не должно иметь значения. Чтение должно быть, имхо, внешним. - person M. Deinum; 02.12.2014
comment
Как он будет внедрять их в Объект, который создал сам? Я не делал предположения, что он делает это из управляемого компонента Spring. Что не во внешнем виде в моем ответе? - person Stijn Geukens; 02.12.2014
comment
@ M.Deinum, можно ли указать список местоположений для <util:properties />? - person Vlad.Z; 02.12.2014
comment
@StijnGeukens Вы правы в том, что это тоже внешнее. Я искал только то, как получить объект Properties, чтобы его можно было передать методу override. Я бы, наверное, создал какую-то фабрику для создания объекта контекста, чтобы он как-то красиво абстрагировался. - person M. Deinum; 02.12.2014

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

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

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

person mkvcvc    schedule 02.12.2014
comment
можно ли сослаться на этот bean-компонент на существующий элемент <util:properties/>? Кроме того, правда ли, что вы можете указать более одного значения для местоположения? - person Vlad.Z; 02.12.2014