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

2022-09-02 23:24:43

我还没有把头缠绕在春天,所以如果这个问题没有意义,请纠正我......

我有一个 PropertyPlaceholderConfigurer

<bean id="rdbmPropertiesPlacholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" lazy-init="false">
    <property name="location" value="classpath:/properties/rdbm.properties" />
</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 开源 Web 门户项目。


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

属性占位符配置器只是合并所有这些,看起来只有一个,所以你的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 属性。

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