這兩天平臺中集成redis和mongodb遇到一個問題java
單獨集成redis和單獨集成mongodb時均可以正常啓動程序,可是當兩個同時集成進去時就會報如下問題redis
Could not resolve placeholder 'mongo.port' in string value "${mongo.port}
百思不得解後,經多方蒐集查證,終於找到問題緣由。spring
在spring的xml配置文件中當有多個*.properties文件須要加載時。mongodb
應該這樣使用使用socket
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:mongodb.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean>
或者 spa
<context:property-placeholder location="classpath*:redis.properties" ignore-unresolvable="true" />
可是 ignore-unresolvable="true" 和 <property name="ignoreUnresolvablePlaceholders" value="true" /> 這兩個屬性值必須爲truecode
緣由以下(摘自於文章最後的連接)xml
Spring容器採用反射掃描的發現機制,在探測到Spring容器中有一個org.springframework.beans.factory.config.PropertyPlaceholderConfigurer的Bean就會中止對剩餘PropertyPlaceholderConfigurer的掃描(Spring 3.1已經使用PropertySourcesPlaceholderConfigurer替代PropertyPlaceholderConfigurer了)。
而<context:property-placeholder/>這個基於命名空間的配置,其實內部就是建立一個PropertyPlaceholderConfigurer Bean而已。換句話說,即Spring容器僅容許最多定義一個PropertyPlaceholderConfigurer(或<context:property-placeholder/>),其他的會被Spring忽略掉(其實Spring若是提供一個警告就行了)。 htm
原文章中提到最後是把全部的資源文件中的資源放在一塊兒加載
以下:
#mongo的資源屬性 mongo.host=192.168.111.230 mongo.port=40000 mongo.connectionsPerHost=8 mongo.threadsAllowedToBlockForConnectionMultiplier=4 mongo.connectTimeout=1500 mongo.maxWaitTime=1500 mongo.autoConnectRetry=true mongo.socketKeepAlive=true mongo.socketTimeout=1500 mongo.slaveOk=true mongo.write.number=1 mongo.write.timeout=0 mongo.write.fsync=true mongo.dbname=test #redis的資源屬性 redis.host=192.168.111.225 redis.port=6379 redis.pass= redis.maxIdle=300 redis.maxTotal=600 redis.minIdle=100
可是本人認爲這樣加載不利於系統的拆分,耦合較高。所以本人推薦仍是使用單獨加載每一個子系統本身的資源文件最好,如:
#mongo加載資源文件 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:mongodb.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> #redis加載資源文件 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:redis.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean>
只要保證ignoreUnresolvablePlaceholders都爲true,或這最後一個加載的爲false,以前的都爲true便可。