Как передать HashMap свойств в бин Autowired весной?
Вместо того, чтобы создавать PersistenceManagerFactory
в моем приложении вот так:
Properties properties = new Properties();
properties.setProperty("javax.jdo.PersistenceManagerFactoryClass",
"org.datanucleus.jdo.JDOPersistenceManagerFactory");
properties.setProperty("javax.jdo.option.ConnectionDriverName","com.mysql.jdbc.Driver");
properties.setProperty("javax.jdo.option.ConnectionURL","jdbc:mysql://localhost/myDB");
properties.setProperty("javax.jdo.option.ConnectionUserName","login");
properties.setProperty("javax.jdo.option.ConnectionPassword","password");
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(properties);
Я хочу настроить его для внедрения зависимостей в Spring примерно так:
<bean id="persistenceManagerFactory" class="org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean" lazy-init="true">
<property name="persistenceManagerFactoryName" value="transactions-optional" />
</bean>
Но я не уверен, как пройти Properties
в application-context.xml
(без использования jdoconfig.xml
).
Возможно ли это в application-context.xml
пройти все это Properties
значения для автопроводки?
2 ответа
Либо использовать встроенный <props>
заблокировать, как предложил Стивен С, или использовать файл свойств вместе с PropertiesPlaceHolderConfigurer, как это предлагается в справочном руководстве Spring:
Сначала зарегистрируйте PropertyPlaceholderConfigurer:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations"
value="classpath:com/foo/jdbc.properties"/>
</bean>
Или используйте ярлык для новой школы:
<context:property-placeholder
location="classpath:com/foo/jdbc.properties"/>
Это пример содержимого для файла свойств:
jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root
А вот как вы назначаете свойства:
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
Примеры взяты из Spring Reference. Хорошая вещь в этом подходе состоит в том, что а) вы можете повторно использовать один и тот же файл свойств для разных контекстов приложения, б) для модульных тестов, вы просто помещаете другую версию свойств в путь к классам (в сценарии maven в src/test/ ресурсы вместо src/main/resources), и вам не нужно ничего менять.
Вы также можете настроить LocalPersistenceManagerFactoryBean напрямую с помощью файла свойств (см. Настройку PersistenceManagerFactory):
<beans>
<bean id="myPmf" class="org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean">
<property name="configLocation" value="classpath:kodo.properties"/>
</bean>
</beans>
Простой способ сделать это - использовать <props>
элемент для указания объекта Properties и его записей. Это описано в разделе 3.4.2.4 Справочного руководства по пружине.
Есть и другие альтернативы для более сложных вариантов использования; например, есть класс фабрики свойств, который может собрать объект Properties из нескольких источников.