1. 程式人生 > >Spring匯入多個獨立的 .properties配置檔案

Spring匯入多個獨立的 .properties配置檔案

在使用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" />