由于属性名称空间是共享的,因此不确定是否可以,但是我想知道如果很少有来自同一类且仅由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传递给构造函数,但这不必要使类的逻辑复杂化。
在不修改类逻辑的情况下,如何(或如果)可以基于不同文件中的值进行属性注入?
答案 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}
,因为出于某些原因,在使用前缀的情况下,前一种表示法会将'$ {'连接到值