Spring Boot 動態修改properties的內容。
如果要在Spring程式中動態修改Environment
中properties的內容,可透過ConfigurableEnvironment
來新增或修改Environment
中原本的properties內容。
例如下面是message.properties
檔。
message.properties
demo.system.name=demo
在SpringBootApplication類別設定@PropertySource
把message.properties
配置檔的屬性注入。
DemoApplication
package com.abc.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;
@SpringBootApplication
@PropertySource(value = {"classpath:message.properties"}) // <--
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
下面建立一個DemoController
來測試利用ConfigurableEnvironment
動態修改properties的效果。
DemoController
package com.abc.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collections;
import java.util.Map;
@RestController
public class DemoController {
@Autowired
private ConfigurableEnvironment configEnv;
@Autowired
private Environment env;
@GetMapping("/system/name")
public String getSystemName() {
String oldSystemName = env.getProperty("demo.system.name");
System.out.println(oldSystemName);
return oldSystemName;
}
@GetMapping("/system/name/update/{systemName}")
public String updateSystemName(@PathVariable String systemName) {
MutablePropertySources propertySources = configEnv.getPropertySources();
Map<String, Object> map = Collections.singletonMap("demo.system.name", systemName);
propertySources.addFirst(new MapPropertySource("new", map));
String newSystemName = env.getProperty("demo.system.name");
System.out.println(newSystemName);
return newSystemName;
}
}
啟動系統進行下面測試。本範例程式的本機路徑為http://localhost:8080/demo
。
在瀏覽器網址列輸入http://localhost:8080/demo/system/name
會呼叫DemoController.getSystemName()
並印出message.properties
的demo.system.name=demo
內容如下。
demo
接著再瀏覽器網址列輸入http://localhost:8080/demo/system/name/update/sample
會呼叫DemoController.updateSystemName()
更新(覆蓋)原有的demo.system.name=demo
並印出以下。
sample
參考:
沒有留言:
張貼留言