如何从多个文件中收集弹簧属性以在单个 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 上使用的主要内容,如果未能解决你的问题,请参考以下文章