【问题标题】:How to pass a HashMap of properties to an Autowired bean in Spring?如何在 Spring 中将属性的 HashMap 传递给 Autowired bean?
【发布时间】:2010-09-19 01:33:03
【问题描述】:

而不是像这样在我的应用程序中实例化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>

但我不确定如何在application-context.xml 中传递Properties(不使用jdoconfig.xml)。

是否可以在 application-context.xml 中为自动装配传递所有这些 Properties 值?

【问题讨论】:

    标签: java spring spring-mvc jdo autowired


    【解决方案1】:

    执行此操作的简单方法是使用&lt;props&gt; 元素来指定Properties 对象及其条目。这在 Spring 参考手册的Section 3.4.2.4 中有描述。

    对于更复杂的用例,还有其他替代方案;例如有一个属性工厂类可以从多个来源组装一个 Properties 对象。

    【讨论】:

      【解决方案2】:

      要么按照 Stephen C 的建议使用内联 &lt;props&gt; 块,要么按照 in the Spring Online Reference 的建议将属性文件与 PropertiesPlaceHolderConfigurer 一起使用:

      首先注册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。这种方法的好处是a)您可以为不同的应用程序上下文重用相同的属性文件,b)对于单元测试,您只需将不同版本的属性放在类路径上(在 src/test/ 中的 maven 场景中)资源而不是 src/main/resources),您无需更改任何其他内容。

      您也可以直接使用属性文件配置 LocalPersistenceManagerFactoryBean(请参阅PersistenceManagerFactory setup):

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-29
        • 2013-07-07
        • 1970-01-01
        • 1970-01-01
        • 2012-11-13
        • 2017-02-07
        相关资源
        最近更新 更多