之前的配置方式
<context:property-placeholder location="classpath:redis.properties" />
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:config.properties" />
</bean>
<bean id="characterEncodingFilter" class="org.springframework.web.filter.CharacterEncodingFilter">
<property name="encoding">
<value>utf-8</value>
</property>
</bean>
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
PropertyPlaceholderConfigurer本身是实现了一个接口,在Spring加载过程中,调用了一个工厂模式注入配置文件,也就是说,它不能作为一个bean作为其他bean的ref,所以在代码里面读取配置文件的value的时候会存在各种问题
换一种方法
<bean id="urlConfigProperties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations" >
<list>
<value>classpath:redis.properties</value>
<value>classpath:config.properties</value>
</list>
</property>
</bean>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<property name="properties" ref="urlConfigProperties"/>
</bean>
这样全局注入多个配置文件都会生效,并且在下面可以引用
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
在java代码里面
//urlConfigProperties就是PropertiesFactoryBean的id
@Value("#{urlConfigProperties['redis.spider.timeout']}")
private String spiderTimeout;
可以直接读取,当然,读到的必然是一个字符串