Spring-为每个bean使用不同的属性文件

时间:2018-08-29 08:06:54

标签: java spring

由于属性名称空间是共享的,因此不确定是否可以,但是我想知道如果很少有来自同一类且仅由ID区别的bean,如何使用特定配置文件中的值进行bean属性注入。

例如,假设有一个位置类

class Position{
    int id;
    String title;
}

每个位置都有一个带有值的属性文件:

Employee.properties
    id=1
    title=Employee


Director.properties
    id=2
    name=Director

XML配置文件如下:

<beans xmlns=.......>
    <bean id="employeeProp" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations" value="classpath:Employee.properties"/>
    </bean>

    <bean id="directorProp" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations" value="classpath:Director.properties"/>
    </bean>

    <bean id="employee" class="com.example.title" lazy-init="true">
        <property name="id" value="#{employeeProp.id}"/>
        <property name="title" value="#{employeeProp.title}"/>

    </bean>

    <bean id="director" class="com.example.title" lazy-init="true">
        <property name="id" value="#{directorProp.id}"/>
        <property name="title" value="#{directorProp.title}"/>
    </bean>
</beans>

显然这是行不通的,因为在#{employeeProp.id}中,我引用的是PropertyPlaceholderConfigurer对象的id字段,而不是它从文件中加载的数据。 Property or field 'id' cannot be found on object of type 'org.springframework.beans.factory.config.PropertyPlaceholderConfigurer' - maybe not public?

我考虑过将配置作为内部bean传递给构造函数,但这不必要使类的逻辑复杂化。

在不修改类逻辑的情况下,如何(或如果)可以基于不同文件中的值进行属性注入?

1 个答案:

答案 0 :(得分:0)

原来,您可以使用placeholderPrefix属性来引用确切的配置占位符

因此生成的文件看起来像

<beans xmlns=.......>
<bean id="employeeProp" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations" value="classpath:Employee.properties"/>
    <property name="placeholderPrefix" value="employee-"/>
</bean>

<bean id="directorProp" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations" value="classpath:Director.properties"/>
    <property name="placeholderPrefix" value="director-"/>
</bean>

<bean id="employee" class="com.example.title" lazy-init="true">
    <property name="id" value="employee-id}"/>
    <property name="title" value="employee-title}"/>

</bean>

<bean id="director" class="com.example.title" lazy-init="true">
    <property name="id" value="director-id}"/>
    <property name="title" value="directorProp-title}"/>
</bean>

请注意,我使用的不是默认值引用表示法${name},而是使用name},因为出于某些原因,在使用前缀的情况下,前一种表示法会将'$ {'连接到值