Spring 配置文件的注入问题

之前的配置方式

<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;

可以直接读取,当然,读到的必然是一个字符串

刘摸鱼

退堂鼓表演艺术家

杭州