Как передать HashMap свойств в бин Autowired весной? - PullRequest
1 голос
/ 19 сентября 2010

Вместо создания экземпляра 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 ]

3 голосов
/ 19 сентября 2010

Простой способ сделать это - использовать элемент <props> для указания объекта Properties и его записей. Это описано в разделе 3.4.2.4 справочного руководства по пружине.

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

1 голос
/ 19 сентября 2010

Либо используйте встроенный блок <props>, как предложил Стивен С, либо используйте файл свойств вместе с PropertiesPlaceHolderConfigurer , как предлагается в Spring Online Reference :

Сначала зарегистрируйте 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>
...