Spring 加載項目外部配置文件


背景

在項目的部署過程中,一般是打成 war 或者 jar 包,這樣一般存在兩種問題:

  1. 即使是配置文件修改,也還需要整個項目重新打包和部署。
  2. 整個項目只有一套環境,不能切換。

針對上面的問題,可以使用外部化配置來解決。

需求

由於服務器上的應用服務器存放路徑未知,只知應用服務器的目錄結構。所以需要通過文件的相對路徑,實現外部化配置。

環境

  1. JDK6
  2. Spring 3.2.5

方案

File

不建議使用 File 的相對路徑來獲取,因為以下兩點:

  1. File 的相對目錄會隨着啟動的目錄變化而變化。
  2. File 不能夠獲取 jar 包中的配置文件。

Class

可以使用 getClass().getResource 或者 getClass().getResourceAsStream 來獲取,可以獲取到 jar 包中的文件。

  1. 如果文件路徑以“/”開頭,表示獲取classpath路徑下的文件。
  2. 不以“/”開頭,獲取和當前類同一目錄下的文件。

ClassLoader

ClassLoader 和 Class 類似,區別是 ClassLoader 以“/”開頭返回null,並且相對路徑是獲取 classpath 下的文件。

實現

最終選擇使用 ClassLoader 來實現較為簡單,部分實現。

InputStream is = getClass().getClassLoader().getResourceAsStream(EXTERNAL_CONFIG_FILE);

if (is == null) {
    logger.info("外部配置不存在。");
}
try {

    ResourcePropertySource source = new ResourcePropertySource(new InputStreamResource(is));
    // 外部配置優先級最高
    beanFactory.getBean(StandardEnvironment.class).getPropertySources().addFirst(source);

} catch (IOException e) {

    logger.error("獲取外部配置失敗。", e);
}

拓展

如果使用該種方法,出現錯誤:
xxx has been normalized to [null] which is not valid
則可以參考這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM