Google Code Prettify

2017年7月27日 星期四

變更 property 檔裡的設定值

Java 的程式設定習慣放在 property 檔,這些檔會放置在 classpath 的某處,大部份時候程式都只需要讀取檔案裡的資料,要變更資料是人工變更,但是,萬一程式想變更怎麼辦? 底下式可以辦到 …

紅色部份比較常見,就是讀入 application.properties 裡的資料到 prop 裡,綠色部份是變更想變更的值後在存回去。
Properties prop = new Properties();

URL url = this.getClass().getClassLoader().getResource("application.properties");
URI uri = url.toURI();
File file = new File(uri);
   
InputStream is = new FileInputStream(file);
prop.load(is);
is.close();
   
FileOutputStream os = new FileOutputStream(file);
prop.setProperty("myKey", myValue);
prop.store(os, null);
os.close();
上面這樣就搞定了嗎? 通常應該沒有這麼好過 … Orz...
因為程式中如果有用到這個 property 檔的相關變數應該也要被更新,在 spring framework 中,載入 property 檔,是在 @Configuration 所在的類別再增加如下註釋。
@PropertySource("classpath:application.properties")
在需要使用裡面的設定的類別裡如下載入。
@Value("${myKey}")
private String myValue;
因為我們已經將 property 檔委由 spring framework 管理,要重新載入,就要從 spring 的環境著手。
@Inject
private StandardEnvironment environment;
...
MutablePropertySources propertySources = environment.getPropertySources();
PropertySource resourcePropertySource = propertySources.get("class path resource [application.properties]");
        
URL url = this.getClass().getClassLoader().getResource("application.properties");
URI uri = url.toURI();
File file = new File(uri);
  
InputStream is = new FileInputStream(file);
Properties prop = new Properties();
prop.load(is);
is.close();
        
propertySources.replace("class path resource [application.properties]", new PropertiesPropertySource("class path resource [application.properties]", prop));




沒有留言:

張貼留言