引言:(引自:http://openwebx.org/docs/autoconfig.html)
在一個應用中,我們總是會遇到一些參數,例如:
-
數據庫服務器IP地址、端口、用戶名;
-
用來保存上傳資料的目錄。
-
一些參數,諸如是否打開cache、加密所用的密鑰名稱等等。
這些參數有一個共性,那就是:它們和應用的邏輯無關,只和當前環境、當前系統用戶相關。以下場景很常見:
-
在開發、測試、發布階段,使用不同的數據庫服務器;
-
在開發階段,使用Windows的A開發者將用戶上傳的文件存放在
d:\my_upload
目錄中,而使用Linux的B開發者將同樣的文件存放在/home/myname/my_upload
目錄中。 -
在開發階段設置
cache=off
,在生產環境中設置cache=on
。
很明顯,這些參數不適合被“硬編碼”在配置文件或代碼中。因為每一個從源碼庫中取得它們的人,都有可能需要修改它們,使之與自己的環境相匹配
......
很多框架支持使用placeholder占位符替換配置文件中的參數,然后在運行期或者編譯器讀取properties文件,完成動態配置。最近剛好研究了幾種使用占位符替換配置的方法,故在此做個比較和總結:
-------------------------我是分割線----------------------------
1.使用spring自帶的實體類來配置參數
Spring的框架中為您提供了一個 BeanFactoryPostProcessor 的實作類別: org.springframework.beans.factory.config.PropertyPlaceholderConfigurer。藉由這個類別,您可以將一些組態設定,移出至.properties檔案中,如此的安排可以讓XML定義檔負責系統相關設定,而.properties檔可以作為客戶根據需求,自定義一些相關的參數。
<!--參數配置,參數過濾,使用properties替換占位符 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:config/spring-daily.properties</value> </list> </property> </bean>
2.使用maven自帶的build設置來實現參數過濾
這是通過在build節點中添加filter和resource來實現的,在<build>標簽下有一個<filters>標簽,用於定義指定filter屬性的位置,例如filter元素賦值filters/filter1.properties,那么這個文件里面就可以定義name=value對,這個name=value對的值就可以在工程pom中通過${name}引用,默認的filter目錄是${basedir}/src/main/fiters/
<filters> <filter>src/main/filters/filter-${env}.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources>
3.使用maven的插件maven-war-plugin來實現參數過濾
使用maven-war-plugin這個插件可以在執行打包命令的時候指定我要打哪個環境的包(具體方法不在這里展開講),使用上比maven原生的filter機制要方便,功能也更強大
<filters> <filter> src/main/resources/IProject-test.properties </filter> </filters> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <webResources> <resource> <directory>src/main/packageFilter</directory> <filtering>true</filtering> <targetPath>WEB-INF</targetPath> </resource> </webResources> </configuration> </plugin>
4.使用AutoConfig插件來實現參數過濾
AutoConfig是一種類似於Maven Filtering的工具。是阿里開發的,一款功能強大的參數過濾插件,具體功能和使用方法不在這里展開講,想要進一步了解的去這里:http://openwebx.org/docs/autoconfig.html
-------------------------我是分割線----------------------------
4種參數過濾方式的比較:
方法 |
優點 |
缺點 |
替換參數的時期 |
上手難度 |
功能性 |
Spring插件 |
速度快 配置簡單 |
只能針對spring的bean起作用,其它配置內容無法過濾 |
運行時 |
低 |
弱 |
Maven原生設置 |
Maven自帶功能,不需要額外的插件 |
資源文件被復制到目標目錄時才起作用 功能偏弱 |
build時 |
中 |
偏弱 |
maven-war-plugin插件 |
可以針對多套環境進行設置 覆蓋原文件 配置靈活 滿足大部分需求 |
缺少驗證機制 Build時期才執行因此速度較慢
|
build時 |
高 |
強 |
AutoConfig插件 |
有驗證機制; 功能強大 針對配置文件,不需要打包,因此不需要項目源代碼文件 |
教程較少 上手較難 |
build時 |
最復雜 |
最強 |
參考資料:
http://www.cnblogs.com/qq78292959/p/3711501.html
http://lishuaibt.iteye.com/blog/614783
http://nileader.blog.51cto.com/1381108/449956
http://openwebx.org/docs/autoconfig.html