Как собрать свойства 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 с открытым исходным кодом.
Ответы
Ответ 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}.
Это сделает ваши файлы контекста более чистыми и понятными для разработчиков.