2009-02-10 3 views
16

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

У меня есть PropertyPlaceholderConfigurer

<bean id="rdbmPropertiesPlacholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" lazy-init="false"> 
    <property name="location" value="classpath:/properties/rdbm.properties" /> 
</bean> 

И у меня есть инъецированная фасоль, я думаю?

<bean id="PortalDb" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${hibernate.connection.driver_class}" /> 
    <property name="url" value="${hibernate.connection.url}" /> 
    <property name="username" value="${hibernate.connection.username}" /> 
    <property name="password" value="${hibernate.connection.password}" /> 
    ... 

То, что я хочу, это второй заполнитель, указывающий на различные свойства файла с именем пользователя/пароль, так что я могу разделить свойства в двух разных файлах. Тогда информация о подключении к базе данных может быть отделена от имени пользователя/пароля db, и я могу управлять источником, а не другим.

Я попытался в основном копировать rdbmPropertiesPlaceholder с другим идентификатором и файлом и пытаться получить доступ к свойствам, но он не работает.

Этот код является из проекта uPortal с открытым исходным кодом.

+0

См. Также http://stackoverflow.com/questions/686635/is-it-possible-to-have-multiple-propertyplaceholderconfigurer-in-my-applicationc – Vadzim

ответ

28

Используя это обозначение позволяет указать несколько файлов:

<bean id="rdbmPropertiesPlacholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" lazy-init="false"> 
    <property name="locations"> 
     <list> 
      <value>classpath:/properties/rdbm.properties</value> 
      <value>classpath:/properties/passwords.properties</value> 
     </list> 
    </property> 
</bean> 

propertyplaceholderconfigurerer просто сливает все это выглядеть как есть только один, так что ваши определения боб не знаю, где свойства берутся.

+0

Этот синтаксис выглядит нормально, но он, похоже, не загружается мой второй файл. Не совсем уверен, что происходит ... –

+0

Итак, я думаю, что я понял. То же самое делается в двух местах, но это только кажется эффектом в том, на котором я не смотрел. Спасибо, я думаю, это исправлено! –

17

org.springframework.beans.factory.config.PropertyPlaceholderConfigurer может это сделать (как уже было сказано. Что вы можете сделать, так это использовать интервал имен, чтобы вы могли ссылаться на свойства с одинаковым именем из обоих файлов . без ambiquity для примера, вы можете сделать это:

<bean id="generalPropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:/properties/general.properties"/> 
</bean> 

<bean id="db.PropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:/properties/rdbm.properties" /> 
    <property name="placeholderPrefix" value="$db{" /> 
    <property name="placeholderSuffix" value="}" />  
</bean> 

в ваших контекстных файлов, теперь вы можете обратиться к общим свойствам с $ {SomeProperty}, и относятся к RDBM свойства с $ дб {SomeProperty }.

Этот сделает ваши файлы контекста более чистыми и понятными для разработчиков.

+1

Будет ли это работать, когда я хочу получить содержимое файла '.properties', т.е.' @Value ("$ {content.of.properties.file}") '? – 2014-02-13 09:45:38