项目配置文件更改,不重启的情况下重载配置文件,emmmmm第一想法是刷新上下文可以实现,真香。

Spring-Boot版本: 2.1.17.RELEASE

1. AbstractApplicationContext Refresh(不可用)

        以下是refresh的部分源码,这里不分析了,可以看到做了很多准备,这个方法是不能实现上下文刷新的。
        因为refresh只能被调起一次,启动类中多次调起会被catch住然后抛出异常。
        那不在启动类中调起呢,会检测线程池,然后给你shut down掉
        所以刷新上下文,一言难尽

   this.prepareRefresh();
   ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
   this.prepareBeanFactory(beanFactory);

   try {
       this.postProcessBeanFactory(beanFactory);
       this.invokeBeanFactoryPostProcessors(beanFactory);
       this.registerBeanPostProcessors(beanFactory);
       this.initMessageSource();
       this.initApplicationEventMulticaster();
       this.onRefresh();
       this.registerListeners();
       this.finishBeanFactoryInitialization(beanFactory);
       this.finishRefresh();
   } catch (BeansException var9) {
       if (this.logger.isWarnEnabled()) {
           this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
       }

       this.destroyBeans();
       this.cancelRefresh(var9);
       throw var9;
   } finally {
       this.resetCommonCaches();
   }

在启动时,调起refresh,会被告知仅能调起一次。
在这里插入图片描述
在请求方法中调起refresh,会检测线程池,然后shut down
在这里插入图片描述

2. RefreshScope 刷新配置

这里只写了SpringBoot 2.0.3.RELEASE 版本以后的demo
依赖:cloud依赖与SpringBoot版本不能差太大,不然启动报错

	<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

SpringBoot 2.0.3.RELEASE以后的版本需要加配置

management.endpoints.web.exposure.include=refresh

启动项目,查看配置,然后发送请求,然后再看配置是否成功刷新

# 这个是刷新接口
curl -X POST http://localhost:8080/actuator/refresh  

成功后会返回哪些属性的值有变化
在这里插入图片描述
注意,在Idea中,启动项目时,读取的配置文件不是工程的配置文件,是打包后的配置文件,别忽略这个了,不然影响结果。
在这里插入图片描述

借鉴博客:https://www.cnblogs.com/weihuang6620/p/13723219.html

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐