一、背景故事
前陣子我接手了公司另外一個同事手里的項目,項目是用的springboot 寫的,但是比較坑的就是這個項目寫的有點不倫不類。雖然是用的springboot,但由於他是拿了一堆代碼拼湊起來的,估計他沒去研究springboot的常規設置,所以用了一個很直接的辦法,把所有配置信息都塞到application.properties文件里面,然后不同環境的配置文件用起來每次都把application文件覆蓋掉。然后在代碼里載入application.properties文件,來作為讀取配置文件的公共靜態方法。
我剛接手代碼的時候只是發現配置文件各種混亂,也沒多想,上來就把配置文件全部整理了一遍。整理完后,我就嘗試啟動服務,發現各種報錯,配置文件讀取錯誤。我一驚,翻了代碼才發現上面說的大坑。那么下面我就記錄下我自己某度了好久,才想到的改動最小的辦法。原諒我水平不是太高。
二、代碼
1.首先是原先的讀取配置文件的公共方法。
public class ConfigUtil { /** * 日志. */ private static Logger logger = Logger.getLogger(ConfigUtil.class); // 初始化配置文件 private static Properties pro = new Properties(); static { final Resource resource = new ClassPathResource( "/META-INF/properties/application.properties"); InputStream ips = null; try { ips = resource.getInputStream(); pro.load(ips); } catch (final IOException e) { logger.info(e.getMessage()); } finally {// QKX 20131223關閉輸入流 try { if (ips != null) { ips.close(); } } catch (final IOException e) { logger.info(e.getMessage()); } } } // 獲取配置文件的中配置的值 public static String getValue(final String key) { return pro.getProperty(key).trim(); } }
這樣的問題就在於我把配置文件拆成這種形式的時候,他還是只能讀取到application.properties中的屬性,讀取不了其他的。

2.由於項目已經上過線了,所以想盡量少改動,所以我就思考只改這個公共方法,不要動其他業務的代碼。於是就變成了下面的樣子。
@Component public class ConfigUtil { @Autowired private Environment env; private static Environment staticEnv; @PostConstruct public void init() { staticEnv = env; } // 獲取配置文件的中配置的值 public static String getValue(final String key) { return staticEnv.getProperty(key).trim(); } }
3.這樣確實能夠讀取配置文件,但是有一個問題,就是在這個bean被加載之前,這個方法還是無效的。具體的順序你們看自己對應的項目,我這里就只有主類中的一些bean和一個隊列線程。那么這里我就用@Value注解來讀取相關屬性就解決了。
