如何从多个文件中收集弹簧属性以在单个 bean 上使用

Posted

技术标签:

【中文标题】如何从多个文件中收集弹簧属性以在单个 bean 上使用【英文标题】:How to collect spring properties from multiple files for use on a single 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 开源门户网站项目。

【问题讨论】:

另见***.com/questions/686635/… 【参考方案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 引用常规属性,并使用 $dbsomeproperty 引用 rdbm 属性。

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

【讨论】:

一旦我想获取.properties 文件的内容,即@Value("$content.of.properties.file"),这项工作是否有效?

以上是关于如何从多个文件中收集弹簧属性以在单个 bean 上使用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用弹簧从属性文件加载地图

如何从多个数据库中收集数据并将它们绑定到单个 datagridview 中?

如何使用 Maven 配置文件设置弹簧活动配置文件

jar弹簧启动属性文件

覆盖多个弹簧活动配置文件的属性值

如何使用scrapy将来自多个页面的数据收集到单个数据结构中