1. 程式人生 > >Spring PropertyPlaceholderConfigurer 自定義擴充套件來解決多環境配置載入的問題

Spring PropertyPlaceholderConfigurer 自定義擴充套件來解決多環境配置載入的問題

轉載自:http://blog.csdn.net/feiyu8607/article/details/8282893

個人見解:在自動化測試階段,我們的自動化用例不僅要在本地執行,而且會在jenkins上執行,而且兩者執行過程中所依賴的環境配置很有可能是不一樣的,對於這種情況,我們就需要動態載入環境配置,而不是依賴人工介入或者人工注意;這個時候PropertyPlaceholderConfigurer 自定義就可以派上用場了;另外發現一個比較好的載入方案,我們可以把總控性配置放在本地配置檔案中,然後不管哪種環境執行,都先把本地配置載入起來,然後再判斷是否是jenkins執行,如果是,就把jenkins的環境配置載入起來,覆蓋掉之前的環境配置,而且覆蓋哪些配置,我是可以調整的;感覺這種方式更加動態、穩定;

以下是原文轉載:

spring中PropertyPlaceholderConfigurer這個類,它是用來解析Java Properties屬性檔案值,並提供在spring配置期間替換使用屬性值。接下來讓我們逐漸的深入其配置。

 基本的使用方法是:

  1. <beanid="propertyConfigurerForAnalysis"
  2.       class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  3.     <propertyname="location">
  4.         <value>classpath:/spring/include/dbQuery.properties</value>
  5.     </property>
  6. </bean>

其中classpath是引用src目錄下的檔案寫法。

當存在多個Properties檔案時,配置就需使用locations了:(2)

  1. <beanid="propertyConfigurer"
  2.       class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  3.     <propertyname="locations">
  4.        <list>
  5.           <value>classpath:/spring/include/jdbc-parms.properties</value>
  6.           <value>classpath:/spring/include/base-config.properties</value>
  7.         </list>
  8.     </property>
  9. </bean>

接下來我們要使用多個PropertyPlaceholderConfigurer來分散配置,達到整合多工程下的多個分散的Properties檔案,其配置如下:(3)
  

  1. <beanid="propertyConfigurerForProject1"
  2.       class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  3.     <propertyname="order"value="1"/>
  4.     <propertyname="ignoreUnresolvablePlaceholders"value="true"/>
  5.     <propertyname="locations">
  6.       <list>
  7.         <value>classpath:/spring/include/dbQuery.properties</value>
  8.       </list>
  9.     </property>
  10. </bean>
  11. <beanid="propertyConfigurerForProject2"
  12.       class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  13.     <propertyname="order"value="2"/>
  14.     <propertyname="ignoreUnresolvablePlaceholders"value="true"/>
  15.     <propertyname="locations">
  16.       <list>
  17.         <value>classpath:/spring/include/jdbc-parms.properties</value>
  18.         <value>classpath:/spring/include/base-config.properties</value>
  19.       </list>
  20.     </property>
  21. </bean>

其中order屬性代表其載入的順序,如果沒有設定就按照載入xml檔案時的順序,而ignoreUnresolvablePlaceholders為是否忽略不可解析的Placeholder,如果配置了多個PropertyPlaceholderConfigurer,則該屬性必須設定且為true,否則propertyConfigurerForProject2的properties檔案不會被載入.

至此你已經瞭解到瞭如何使用PropertyPlaceholderConfigurer,如何使用多個Properties檔案,以及如何配置多個PropertyPlaceholderConfigurer來分解工程中分散的Properties檔案。至於PropertyPlaceholderConfigurer還有更多的擴充套件應用,如屬性檔案加密解密等方法將在之後的博文中續寫。

注意事項:
(1)如果上面的dbQuery.properties與jdbc-parms.properties檔案中有相同的引數配置名稱,dbQuery.properties中配置的引數值不會被後面的覆蓋;
(2)如果jdbc-parms.properties,base-config.properties彼此有相同引數名配置,jdbc-parms.properties中的配置的值會被覆蓋;
 

自定義擴充套件PropertyPlaceholderConfigurer實現

例如:配置檔案的路徑,需要動態確定的,就需要自己擴充套件PropertyPlaceholderConfigurer的實現,自己獲取檔案路徑,load properties檔案,然後將load後的properties加入PropertyPlaceholderConfigurer

  1. package com.common.spring.ext;  
  2. import java.util.Properties;  
  3. import java.util.Set;  
  4. import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;  
  5. import com.common.exception.ApplicationException;  
  6. import com.common.util.GlobalProperties;  
  7. import com.common.util.PropertiesUtil;  
  8. publicclass GollfPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {  
  9.     publicvoid setGollfPropFiles(Set<String> gollfPropFiles) {  
  10.         String propPath = GlobalProperties.getProperty(GlobalProperties.PROPERTIES_FOLDER_PATH); //通過其他配置獲取路徑
  11.         String fileSeparator = System.getProperty("file.separator");  
  12.         Properties properties = new Properties();  
  13.         for (String gollfPropFile : gollfPropFiles) {  
  14.             String nodeName = System.getProperty("weblogic.Name");  
  15.             gollfPropFile = gollfPropFile.replaceAll("\\[NODE_NAME\\]", nodeName); //NODE_NAME 是根據不同weblogic server確定
  16.             String file = propPath + fileSeparator + gollfPropFile;  
  17.             try {  
  18.                 logger.info("Loading properites file from " + file);  
  19.                 Properties prop = PropertiesUtil.loadProperties(file); //返回properties檔案
  20.                 logger.debug("Properties -> " + prop);  
  21.                 if(prop != null) {  
  22.                     properties.putAll(prop);  
  23.                 }  
  24.             } catch (Exception e) {  
  25.                 logger.fatal(new ApplicationException("Properties file " + gollfPropFile +   
  26.             " cannot be found. All related functionalities may be unavailable", e, true));  
  27.             }  
  28.         }  
  29.         this.setProperties(properties); //關鍵方法,呼叫的PropertyPlaceholderConfigurer中的方法,
  30.                    //通過這個方法將自定義載入的properties檔案加入spring中
  31.     }  
  32. }  

xml配置

  1. <beanid="auditJmsProperties"
  2.       class="com.common.spring.ext.GollfPropertyPlaceholderConfigurer">
  3.        <propertyname="gollfPropFiles">
  4.            <set>
  5.                <value>[NODE_NAME]_jms.properties</value>
  6.            </set>
  7.        </property>
  8.    </bean>


PropertyPlaceholderConfigurer中載入properties檔案時,實際呼叫的:org.springframework.core.io.support.PropertiesLoaderSupport中的mergeProperties

Spring原始碼

  1. protected Properties mergeProperties() throws IOException {  
  2.   Properties result = new Properties();  
  3.   if (this.localOverride) {  
  4.    // Load properties from file upfront, to let local properties override.
  5.    loadProperties(result);  
  6.   }  
  7.   if (this.localProperties != null) {  
  8.    for (Properties localProp : this.localProperties) {  
  9.        //將使用者自定義載入的屬性值,與spring載入的合併
  10.        CollectionUtils.mergePropertiesIntoMap(localProp, result);   
  11.      }  
  12.   }  
  13.   if (!this.localOverride) {  
  14.    // Load properties from file afterwards, to let those properties override.
  15.    loadProperties(result);  
  16.   }  
  17.   return result;  
  18.  }  

 
 
將多個properties檔案中的配置載入以後合併成一個Properties物件返回.
上面的this.setProperties(properties)方法,就是設定localProperties的引用,localProperties不為空的話,將使用者自定義載入的properties屬性合併到Spring載入的result Properties物件中
localOverride引數:為true的話,表示使用者自定義載入的屬性值覆蓋spring系統載入的,如果同名的話.

自定義使用注意:使用者自定義方法的呼叫務必在spring 初始化呼叫PropertyPlaceholderConfigurer的mergeProperties()方法之前呼叫,否則配置檔案就沒有合併.一般就set值的時候呼叫.


相關推薦

Spring PropertyPlaceholderConfigurer 定義擴充套件解決環境配置載入的問題

轉載自:http://blog.csdn.net/feiyu8607/article/details/8282893 個人見解:在自動化測試階段,我們的自動化用例不僅要在本地執行,而且會在jenkins上執行,而且兩者執行過程中所依賴的環境配置很有可能是不一樣的,對於這種

WampServer 3.0.4 64bit定義虛擬目錄、站點配置、埠號

WampServer 3.0.4 64bit自定義虛擬目錄、多站點配置、埠號 1. 自定義虛擬目錄 首先在C盤建立了一個名叫PHP的資料夾 然後 開啟WAMP安裝目錄->點選bin->apache->config->extra->httpd-vho

七、Wampserver3.0.6定義虛擬目錄、站點配置及埠號的更改

下面請先安裝wamp整合包,在進行下面的操作,下載、安裝及簡單操作此處略(比較簡單,就不再詳細說明)。 自定義虛擬目錄(根目錄) 虛擬目錄:每個Internet服務可以從多個目錄中釋出。通過以通用命名約定 (UNC)名、使用者名稱及用於訪問許可權的密碼

Spring boot 的profile功能如何實現環境配置自動切換

通常服務端應用開發需要經過以下幾個流程: 開發 -> 測試 -> RC驗證 -> 上線 這就涉及到四個不同的環境,開發環境、測試環境、RC環境以及生產環境,為了避免不同環境之間相互干擾,通常需要獨立部署資料庫、快取伺服器等,那麼應用配置也要做相應的調整。

Spring Data Jpa框架定義查詢語句返回定義實體的解決方案

在使用Spring Data Jpa框架時,根據業務需求我們通常需要進行復雜的資料庫查詢,並返回我們自定義的實體類,而在該框架下,目前僅僅支援返回與資料庫對映進行持久化的POJO實體。雖然在框架上我們可以使用@Query註解執行我們自定義的sql語句,但是其返回值為List<Object[

Spring Boot 配置檔案詳解:定義屬性、隨機數、環境配置

相信很多人選擇Spring Boot主要是考慮到它既能兼顧Spring的強大功能,還能實現快速開發的便捷。我們在Spring Boot使用過程中,最直觀的感受就是沒有了原來自己整合Spring應用時繁多的XML配置內容,替代它的是在pom.xml中引入模組化的Starter POMs,其中各個模組都有自己的預

藉助Spring定義註解完成資料來源配置

前一段時間研究了一下spring多資料來源的配置和使用,為了後期從多個數據源拉取資料定時進行資料分析和報表統計做準備。由於之前做過的專案都是單資料來源的,沒有遇到這種場景,所以也一直沒有去了解過如何配置多資料來源。 後來發現其實基於spring來配置和使用多資

利用Spring AOP定義註解解決日誌和簽名校驗

一、需解決的問題 部分API有簽名引數(signature),Passport首先對簽名進行校驗,校驗通過才會執行實現方法。     第一種實現方式(Origin):在需要簽名校驗的接口裡寫校驗的程式碼,例如: boolean isValid = accountService.val

基於spring的schema定義擴充套件(二)

上文分析了spring如何解析xml中標籤 自定義schema規範約束 新建test-schema.xsd檔案定義如下內容 <xsd:schema xmlns="http://www.myhost.com/schema/demo" xmlns:xsd="htt

Spring JPA 定義實體類和定義sql語句表關聯複雜子查詢

   最近在寫一個功能,因為不是很熟悉jpa操作,接觸時間不久,所以又習慣性地用了sql語句來查詢,主要是嫌麻煩,想返回的資料用一條資料返回來就可以了,所以就用spring  jpa寫了個自定義的實體類來裝我專門返回來的資料欄位,然後sql也有點複雜,join了幾張表,

spring-data-JPA使用JpaRepository註解定義SQL查詢資料庫表查詢

一. 首先在@Entity註解的類裡面要寫好外來鍵關係.  這個 @ManyToOne 註解可以建立外來鍵關係, 不要在自己傻傻的寫一個 private int grades_id;  寫了這個註解以後它會自動的把 Classes 這張表加上 grades_id 欄位.

Android定義控制元件系列 十:利用新增定義佈局搞定觸控事件的分發,解決組合介面中特定控制元件響應特定方向的事件

        這個例子是比較有用的,基本上可以說,寫完這一次,以後很多情況下,直接拿過來addView一下,然後再addInterceptorView一下,就可以輕輕鬆鬆的達到組合介面中特定控制元件來響應特定方向的觸控事件了。         在寫Android應用

spring security 3 中使用定義資料庫設定許可權

參考文件: http://wenku.baidu.com/view/4ec7e324ccbff121dd368364.html 在spring security3中使用自己定義的資料結構來實現許可權設

在struts2中配置定義攔截器放行個方法

return med ttr limit ring req tac cat invoke 源碼: 自定義的攔截器類: //自定義攔截器類:LoginInterceptor ; package com.java.action.interceptor; import j

6.1 如何在spring定義xml標簽

關聯 tex and 啟動流程 調用 mls ram 如果 .com dubbo自定義了很多xml標簽,例如<dubbo:application>,那麽這些自定義標簽是怎麽與spring結合起來的呢?我們先看一個簡單的例子。 一 編寫模型類 1 packa

Spring Cloud - 定義引導屬性源

springcloud spring cloud springcloud微服務 微服務雲架構 引導過程添加的外部配置的默認屬性源是Config Server,但您可以通過將PropertySourceLocator類型的bean添加到引導上下文(通過spring.factories)添加其他源

spring boot定義配置

ati type 方式 prop cat utf get 編碼格式 nap 在spring boot中自定義配置項,一下只是其中的一種實現方式 application.properties alipay.url = https://openapi.alipaydev.co

spring boot定義log4j2日誌文件

-m logs cnblogs port evel 一個 efault 實踐 示例 背景:因為從 spring boot 1.4開始的版本就要用log4j2 了,支持的格式有json和xml兩種格式,此次實踐主要使用的是xml的格式定義日誌說明。 spring boot 1

【第四十章】Spring Boot 定義攔截器

ram obj pre .config factor ati bean configure 邏輯 1.首先編寫攔截器代碼 package com.sarnath.interceptor; import javax.servlet.http.HttpServlet

窗體背景的繪制(Windows窗體每次都會重繪其窗體背景,所以我們可以通過攔截窗體重繪背景的消息(WM_ERASEBKGND),並定義方法實現重繪窗體背景)

height com call 消息響應 int idt http msg mes 核心思想:由於Windows窗體每次都會重繪其窗體背景,所以我們可以通過攔截窗體重繪背景的消息(WM_ERASEBKGND),並自定義方法來實現重繪窗體背景。通過TImage組件也可以實現,