2014-12-02 5 views
1

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

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

[UPDATE]

В .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

ответ

1

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

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

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

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

в качестве альтернативы вы можете посмотреть на PropertyPlaceholderConfigurer.

UPDATE

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

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

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

+1

Почему так «сложный».Вы можете просто использовать '' для чтения свойств, которые, в свою очередь, также могут быть введены в элемент ''. Сохраняет загрузку файла дважды. –

+1

Deinum, вы правы, но это будет работать только из управляемых фасолей Spring. Поскольку OP, похоже, сам создает этот объект (newBuilder()), это не сработает. –

+0

Ему нужны свойства, которые следует вводить, как они читаются, не имеет значения. Чтение должно быть, imho, экстернализировано. –

0

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

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

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

+0

Можно ли передать этот компонент в существующий элемент ''? также, верно ли, что вы можете указать более одного значения для местоположения? –

Смежные вопросы