無論項目大小,數據庫、開發環境、測試環境....這些信息,肯定不能在程序中硬編碼。
硬編碼有百壞而無一利,每次信息變動都要重新編譯項目,不能分離運維和開發。
而且配置散落在項目的程序中,無法做到准確集中管理,拖慢項目進度。
我想這也是配置文件出現的原因,配置文件比較主流的格式 properties(鍵值對形式)、xml(對象,復雜數據結構,只有你想不到沒有xml 表達不了的) 等。
本文已比較常見、簡單的 properties 格式的配置文件為例,來看看讀取配置文件幾種不同的姿勢,關注其中的實現和使用,設計模式另表。
Spring 提供了默認的配置文件讀取實現類 org.springframework.core.io.DefaultResourceLoader。
當然你也可以實現 org.springframework.core.io.ResourceLoader 接口自定義配置文件載入實現類。
org.springframework.core.io.DefaultResourceLoader 核心方法 getResource:
public Resource getResource(String location) { Assert.notNull(location, "Location must not be null"); Iterator ex = this.protocolResolvers.iterator(); Resource resource; do { if(!ex.hasNext()) { if(location.startsWith("/")) { return this.getResourceByPath(location); } if(location.startsWith("classpath:")) { return new ClassPathResource(location.substring("classpath:".length()), this.getClassLoader()); } try { URL ex1 = new URL(location); return new UrlResource(ex1); } catch (MalformedURLException var5) { return this.getResourceByPath(location); } } ProtocolResolver protocolResolver = (ProtocolResolver)ex.next(); resource = protocolResolver.resolve(location, this); } while(resource == null); return resource; }
可以看出 Spring 能支持入參路徑的很多方式,包括已 " /"、"classpath" 開頭。
如果你想在項目中使用 Spring 提供的默認配置文件載入實現,可以這樣書寫你的代碼。
ResourceLoader resourceLoader = new DefaultResourceLoader(); Resource resource = resourceLoader.getResource("log4j.properties"); Properties props = new Properties(); props.load(resource.getInputStream());
當然你也可以引入 Apache Commons Configuration jar 內部設計相當考究。
整個 jar 不超過 400K,如果時間充裕,你也可以反編譯看看源碼。
使用方式也特別簡潔,兩行代碼就 OK:
PropertiesConfiguration configuration = new PropertiesConfiguration("log4j.properties"); configuration.getString("log4j.appender.file");
Apache Commons Configuration 默認載入配置文件核心實現類 org.apache.commons.configuration.AbstractFileConfiguration 載入方法:
public void load(String fileName) throws ConfigurationException { try { URL e = ConfigurationUtils.locate(this.fileSystem, this.basePath, fileName); if(e == null) { throw new ConfigurationException("Cannot locate configuration source " + fileName); } else { this.load(e); } } catch (ConfigurationException var3) { throw var3; } catch (Exception var4) { throw new ConfigurationException("Unable to load the configuration file " + fileName, var4); } }
如果你項目對讀取配置文件沒有太多個性化的需求,如果你有足夠時間,如果你嫌棄第三方 Jar 占據你 lib 目錄的一席之地,還有如果你熱愛編程。
仔細一點,你會發現,這些開源框架底層都是已 java.net.URL 載入配置文件。
在載入配置文件的過程中應項目需求采用了恰當的設計模式,使能夠支持一些對配置文件的特定操作。
載入文件後,實例化為 java.util.Properties 對象,進行配置文件獲取。
那就完全可以撸段純 JDK 的寫法,作為工具類放入項目中,編譯後不超過 5K,核心的幾句代碼如下:
URL resource = Thread.currentThread().getContextClassLoader().getResource("log4j.properties"); Properties properties = new Properties(); properties.load(resource.openStream()); properties.getProperty(key);
因為 java.util.Properties 的 load 進行了方法的重載,你也可以不用 URL 方式讀取配置文件,也可以這樣寫:
String url = XXXXX.class.getResource("").getPath().replaceAll("%20", " "); String path = url.substring(0, url.indexOf("classes")) + filePath; //該 path 為你配置文件的路徑 InputStream inputStream = new FileInputStream(path); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); prop.load(bufferedReader);prop.getProperty(key);
上述代碼都為實例核心的幾句代碼,其中的判空和異常都沒有進行處理,僅作為參考。
最後貼上自己封裝的配置文件載入類,不使用任何第三方 jar,有需要的拿走放入項目即可用。