springboot 作为现在 java 开发必备框架,重要程度不言而喻
其中配置文件我们一般是写在 application.yml
所以这个时候就出现了一些问题:
比如说我们想要修改一些配置信息,比如说 redis 地址,数据库账号密码等,这个时候通常的做法是在工程里面修改后重新打包部署,非常麻烦。
开始我们在 springboot 启动类中添加
public static void main(String[] args) {
SpringApplication app = new SpringApplication(DemoApplication.class);
app.addInitializers(new RemoteConfig());
app.run(args);
}
然后写 RemoteConfig 的实现
public class RemoteConfig implements ApplicationContextInitializer {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
//获取当前应用的环境
ConfigurableEnvironment ce = applicationContext.getEnvironment();
Properties properties = new Properties();
properties.put("spring.datasource.url", getRemoteConfigedDbUrl("spring.datasource.url"));
PropertiesPropertySource propertiesPropertySource = new PropertiesPropertySource("remote", properties);
ce.getPropertySources().addFirst(propertiesPropertySource);
}
private String getRemoteConfigedDbUrl(String propertname) {
return "jdbc:mysql://localhost:3306/test";
}
}
其中的getRemoteConfigedDbUrl 就是一个例子
开始 applicationContext,getEnvironment 获取当前应用的环境
一般来说,一个环境可能有好几个配置文件,也就是好几个PropertiesPropertySource 类,这个时候我们希望优先读取我们的远程配置怎么办呢,很简单,把它放到第一个就好了,即 ce.getPropertySources().addFirst();
如果有相同的配置的话,先读第一个,后面的无法覆盖,但请注意,其他的配置也是有效的,未覆盖到的都会加载进来
但是如何实现远程配置呢?
我的思路是再起一个应用,用来读 redis 缓存,然后 properties.put 就放入从 redis 中读取的数据,也就实现了远程配置



