【问题标题】:How to collect spring properties from multiple files for use on a single bean如何从多个文件中收集弹簧属性以在单个 bean 上使用
【发布时间】:2010-10-06 18:13:43
【问题描述】:

我还没有完全理解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}" />
    ...

我想要的是第二个占位符,它使用用户名/密码指向不同的属性文件,以便我可以将属性拆分为两个不同的文件。然后数据库连接信息可以与数据库用户名/密码分开,我可以源控制一个而不是另一个。

我基本上尝试使用不同的 id 和文件复制 rdbmPropertiesPlaceholder 并尝试访问属性,但它不起作用。

此代码来自 uPortal 开源门户网站项目。

【问题讨论】:

标签: java properties spring


【解决方案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>

propertyplaceholderconfigurer 只是合并所有这些,看起来只有一个,所以你的 bean 定义不知道属性来自哪里。

【讨论】:

  • 该语法似乎没问题,但它似乎没有加载我的第二个文件。不太清楚发生了什么...
  • 好的,我想我已经弄清楚了。在两个地方做了同样的事情,但它似乎只对我没有看到的那个有影响。谢谢,我认为这解决了它!
【解决方案2】:

org.springframework.beans.factory.config.PropertyPlaceholderConfigurer 可以做到这一点(正如已经回答的那样。您可能想要做的是利用名称间距,这样您就可以从两个文件中引用同名属性,而无需歧义。对于您的示例,您可以这样做:

<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} 引用常规属性,并使用 $db{someproperty} 引用 rdbm 属性。

这将使您的上下文文件对开发人员来说更加干净和清晰。

【讨论】:

  • 一旦我想获取.properties 文件的内容,即@Value("${content.of.properties.file}"),这项工作是否有效?
猜你喜欢
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 2020-11-22
  • 1970-01-01
  • 2015-11-03
  • 2015-04-14
相关资源
最近更新 更多