我有一堆Spring Bean,它们是通过注解从classpath中提取的,比如说
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
// Implementation omitted
}
在Spring的XML文件中,有一个PropertyPlaceholderConfigurer定义。
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/app.properties" />
</bean>
我想把app.property中的一个属性注入到上面的bean中。我不能简单地做如下事情
<bean class="com.example.PersonDaoImpl">
<property name="maxResults" value="${results.max}"/>
</bean>
因为PersonDaoImpl并不在Spring的XML文件中出现(它是通过注解从classpath中获取的)。我已经做到了以下几点。
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
@Resource(name = "propertyConfigurer")
protected void setProperties(PropertyPlaceholderConfigurer ppc) {
// Now how do I access results.max?
}
}
但我不清楚如何从`ppc'访问我感兴趣的属性?
另一个选择是添加如下所示的appProperties Bean。
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/app.properties" />
</bean>
<bean id="appProperties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="singleton" value="true"/>
<property name="properties">
<props>
<prop key="results.max">${results.max}</prop>
</props>
</property>
</bean>
检索时,这个Bean可以被投到一个java.util.Properties
中,它将包含一个名为results.max
的属性,其值是从app.properties
中读取。同样,这个Bean可以通过@Resource注解被依赖性地注入(作为java.util.Properties的一个实例)到任何类中。
就我个人而言,我更喜欢这个解决方案(与我提出的其他方案相比),因为你可以准确地限制哪些属性是由appProperties暴露的,而且不需要两次读取app.properties。
我需要有两个属性文件,一个用于生产,一个用于开发(不会被部署)的覆盖。
为了同时拥有这两个文件,一个可以自动连接的Properties Bean和一个PropertyConfigurer,你可以写。
<bean id="appProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="singleton" value="true" />
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<value>classpath:live.properties</value>
<value>classpath:development.properties</value>
</list>
</property>
</bean>
并在PropertyConfigurer中引用Properties Bean。
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="properties" ref="appProperties" />
</bean>
一个可能的解决方案是声明第二个Bean,从同一个属性文件中读取。
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/app.properties" />
</bean>
<util:properties id="appProperties" location="classpath:/WEB-INF/app.properties"/>
这个名为'appProperties'的Bean属于java.util.Properties类型,可以使用上面的@Resource attruibute进行依赖注入。