Подтвердить что ты не робот

Как собрать свойства spring из нескольких файлов для использования в одном bean

Я еще не получил свою голову, обернутую вокруг Spring, поэтому исправьте меня, если этот вопрос не имеет смысла...

У меня есть PropertyPlaceholderConfigurer

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

И у меня есть инъекция 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 с открытым исходным кодом.

4b9b3361

Ответ 1

Используя эту нотацию, вы можете указать несколько файлов:

 <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 просто объединяет все это, чтобы выглядеть только один, поэтому ваши определения bean не знают, откуда взялись свойства.

Ответ 2

. 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 с помощью $db {someproperty}.

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