Spring匯入多個獨立的 .properties配置檔案
阿新 • • 發佈:2019-02-19
在使用spring的時候如果在多個xml檔案中配置了
<context:property-placeholder location=""/>
在控制檯會列印警告,導致程式無法執行
如下面我在使用mybatis和redis的時候
spring-mybatis.xml
<context:property-placeholder location="classpath:data/mybatis.properties" />
spring-redis.xml
<context:property-placeholder location="classpath:data/redis.properties" />
導致下面異常
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'jedisPoolConfig' defined in file [C:\Users\abc\Desktop\owowl\target\classes\spring\spring-redis.xml]: Could not resolve placeholder 'redis.pool.maxTotal' in string value "${redis.pool.maxTotal}" ; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'redis.pool.maxTotal' in string value "${redis.pool.maxTotal}"
--------------
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'redis.pool.maxTotal' in string value "${redis.pool.maxTotal}"
內容如下
spring中 context:property-placeholder 匯入多個獨立的 .properties配置檔案?
Spring容器採用反射掃描的發現機制,在探測到Spring容器中有一個 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer的 Bean就會停止對剩餘PropertyPlaceholderConfigurer的掃描(Spring 3.1已經使用PropertySourcesPlaceholderConfigurer替代 PropertyPlaceholderConfigurer了)。
換句話說,即Spring容器僅允許最多定義一個PropertyPlaceholderConfigurer(或),其餘的會被Spring忽略掉(其實Spring如果提供一個警告就好了)。
拿上來的例子來說,如果A和B模組是單獨執行的,由於Spring容器都只有一個PropertyPlaceholderConfigurer, 因此屬性檔案會被正常載入並替換掉。如果A和B兩模組整合後執行,Spring容器中就有兩個 PropertyPlaceholderConfigurer Bean了,這時就看誰先誰後了, 先的保留,後的忽略!因此,只加載到了一個屬性檔案,因而造成無法正確進行屬性替換的問題
所以最後spring-在mvc.xml配置載入全部配置檔案
<!-- 載入所有配置檔案 -->
<context:property-placeholder location="classpath*:data/*.properties"/>
<!-- 還可以是下面方式,載入多個目錄中的 -->
<context:property-placeholder location="classpath:*.properties,classpath:*/*.properties" />