2010-09-19 16 views
1

Au lieu d'instancier un PersistenceManagerFactory dans mon application comme ceci:Comment passer une HashMap de propriétés à un bean Autowired au printemps?

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); 

Je veux le configurer pour l'injection de dépendance dans quelque chose comme Spring ceci:

<bean id="persistenceManagerFactory" class="org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean" lazy-init="true"> 
    <property name="persistenceManagerFactoryName" value="transactions-optional" /> 
</bean> 

Mais je ne suis pas sûr de savoir comment passer le Properties dans le application-context.xml (sans utiliser un jdoconfig.xml).

Est-il possible dans le application-context.xml de passer toutes ces valeurs Properties pour Autowiring?

Répondre

1

Soit utiliser un inline <props> bloc comme Stephen C a suggéré, ou utiliser un fichier de propriétés avec un PropertiesPlaceHolderConfigurer comme suggéré in the Spring Online Reference:

premier registre du PropertyPlaceholderConfigurer:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations" 
     value="classpath:com/foo/jdbc.properties"/> 
</bean> 

Ou utiliser la nouvelle école raccourci équivalent:

<context:property-placeholder 
    location="classpath:com/foo/jdbc.properties"/> 

Ceci est un exemple de contenu pour t propriétés il fichier:

jdbc.driverClassName=org.hsqldb.jdbcDriver 
jdbc.url=jdbc:hsqldb:hsql://production:9002 
jdbc.username=sa 
jdbc.password=root 

Et voici comment vous attribuez les propriétés:

<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> 

Des exemples sont tirés de la référence du printemps. La bonne chose à propos de cette approche est que a) vous pouvez réutiliser le même fichier de propriétés pour différents contextes d'application, b) pour les tests unitaires, vous mettez simplement une version différente des propriétés sur le classpath (dans un scénario maven dans src/test/ressources au lieu de src/main/resources) et vous n'avez pas besoin de changer quoi que ce soit d'autre.

Vous pouvez également configurer le LocalPersistenceManagerFactoryBean directement avec un fichier de propriétés (voir PersistenceManagerFactory setup):

<beans> 

    <bean id="myPmf" class="org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean"> 
    <property name="configLocation" value="classpath:kodo.properties"/> 
    </bean> 

</beans> 
3

La méthode la plus simple consiste à utiliser l'élément <props> pour spécifier l'objet Properties et ses entrées. Ceci est décrit dans Section 3.4.2.4 du Manuel de référence du ressort.

Il existe d'autres alternatives pour des cas d'utilisation plus complexes; par exemple. Il existe une classe de fabrique de propriétés qui peut assembler un objet Properties à partir de plusieurs sources.