SpringBoot - 两种方式刷新配置信息

news2024/12/23 11:43:26

一、第一种方式

@​ConfigurationProperties​不能自动刷新,需要手动调用contextRefresher.refresh()方法来刷新配置。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "biz")
public class BizConfig {
    private String key;
    private Long refresh;

    //省略 gettersetter...
}

二、第二种方式

@RefreshScope 注解可以使得这个类具备刷新功能,可以在配置文件内容变更后,刷新并更新这个配置类的属性值。


import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

/**
 *
 * @RefreshScope 注解可以使得这个类具备刷新功能,可以在配置文件内容变更后,刷新并更新这个配置类的属性值。使用@RefreshScope注解,仅仅只能刷新@Value的配置属性。
 *
 * 在这个配置类中,使用了 @Value 注解注入了一个属性 uuid,该属性的值来源于配置文件中 rest.uuid 属性的值。
 * 由于该配置类使用了 @RefreshScope 注解,所以如果配置文件中 rest.uuid 的值发生变化,
 * Spring Cloud Config Server 就会通知该配置类,然后调用 setUuid() 方法刷新该属性的值,从而实现了动态刷新配置的效果。
 *
 *
 * 如果使用@RefreshScope注解,仅仅只能刷新@Value的配置属性,
 * 而对于@ConfigurationProperties则不能自动刷新,需要手动调用contextRefresher.refresh()方法来刷新配置。
 *
 * 因此,在DemoController中的refresh()方法,通过开启一个新的线程来异步调用contextRefresher.refresh()方法,
 * 实现对@ConfigurationProperties的刷新。这样就可以保证对于@Value和@ConfigurationProperties两种配置属性都可以进行刷新。
 */
@RefreshScope
@Component
public class ValueConfig {
    @Value("${rest.uuid}")
    private String uuid;

   // 省略 gettersetter
}

使用 contextRefresher.refresh() 刷新

import com.alibaba.fastjson.JSONObject;
import com.lfsun.bootdynamicrefresh.config.BizConfig;
import com.lfsun.bootdynamicrefresh.config.ValueConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.refresh.ContextRefresher;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {
    @Autowired
    private ContextRefresher contextRefresher;

    @Autowired
    private BizConfig bizConfig;

    @Autowired
    private ValueConfig valueConfig;

    /**
     * 查询配置信息
     */
    @GetMapping(path = "/show")
    public String show() {
        JSONObject res = new JSONObject();
        res.put("biz", JSONObject.toJSONString(bizConfig));
        res.put("uuid", valueConfig.getUuid());
        return res.toJSONString();
    }

    /**
     * 刷新配置信息
     */
    @GetMapping(path = "/refresh")
    public String refresh() {
        // 新开一个线程进行配置信息的刷新,避免阻塞其他请求的处理
        new Thread(() -> contextRefresher.refresh()).start();
        // 返回刷新后的配置信息
        return show();
    }
}

配置文件 application.yml

biz:
  refresh: ${random.long}
  key: refresh-test

rest:
  uuid: ${random.uuid}

server:
  port: 8081

pom.xml

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

实现效果

http://localhost:8081/show/

 

 http://localhost:8081/refresh/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/913744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch里面的nn.AdaptiveAvgPool2d

今天遇到nn.AdaptiveAvgPool2d((None, 1)) AdaptiveAvgPool2d函数详细解释&#xff1a; 2D自适应平均池化&#xff08;2D adaptive average pooling&#xff09;是一种对输入信号进行二维平均池化的操作&#xff0c;输入信号由多个输入平面&#xff08;input planes&#xff0…

MAC 查看被占用的端口

今天启动一个一个服务的时候&#xff0c;总是报端口被占用的错误&#xff0c;所以就需要找一下是哪个程序占用了端口&#xff0c;查看的命令是&#xff1a; netstat -anp tcp -v | grep 8082那这个命令出来的那个是进程id呢&#xff0c;很显然我画框的就是了&#xff0c;前面的…

「Python|音视频处理|环境准备」如何在Windows系统下安装并配置音视频处理工具FFmpeg

本文主要介绍如何在Windows系统下安装并配置音视频处理工具FFmpeg&#xff0c;方便使用python进行音视频相关的下载或编辑处理。 文章目录 一、下载软件二、解压并配置三、验证安装 一、下载软件 首先要去 ffmpeg官网 下载软件包 由于上面直接下载的按钮是.tar.xz格式的。为了…

IDEA项目实践——VUE介绍与案例分析

系列文章目录 IDEA项目实践——JavaWeb简介以及Servlet编程实战 IDEA项目实践——Spring集成mybatis、spring当中的事务 IDEA项目实践——Spring当中的切面AOP IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——Spring框架简介&#xff0c;以及IOC注解 I…

制造业与MES管理系统:一对不可分割的“黄金搭档”

在当今高度竞争的市场环境中&#xff0c;制造业企业面临着越来越多的挑战。为了保持竞争力并实现可持续发展&#xff0c;许多企业已经开始寻求采用先进的技术和系统来提高生产效率和产品质量。在这方面&#xff0c;MES系统&#xff08;制造执行系统&#xff09;已经成为制造业中…

mac常用

一、查看ip地址 ifconfig en0 二、telnet命令 如果报没有telnet命令则安装 brew install telnet 在linux/unix下使用telnet&#xff08;telnet ip 端口号&#xff09;连接主机时提示Escape character is ^]。 1、这个提示的意思是按Ctrl ]会呼出telnet的命令行。 2、telnet…

esp32 micropython oled实时时钟

简介 合宙esp32C3&#xff0c;128*64 I2C oled&#xff0c;硬件i2c,将下面两个py文件放入esp32. ssd1306.py是我优化后的&#xff0c;为了避免错误&#xff0c;使用我提供的ssd1306驱动 只支持128*64的I2C oled 代码 main.py import network import urequests import ujso…

数据结构——布隆计算器

文章目录 1.什么是布隆过滤器&#xff1f;2.布隆过滤器的原理介绍3.布隆过滤器使用场景4.通过 Java 编程手动实现布隆过滤器5.利用Google开源的 Guava中自带的布隆过滤器6.Redis 中的布隆过滤器6.1介绍6.2使用Docker安装6.3常用命令一览6.4实际使用 1.什么是布隆过滤器&#xf…

JavaScript基础(Dom操作)

目录 一&#xff0c;BOM模型1.1&#xff0c;BOM可实现功能 二&#xff0c;Window对象的常用属性2.1&#xff0c;Window对象的常用方法2.1-1&#xff0c;open()和close()方法 三&#xff0c;History对象四&#xff0c;Location对象五&#xff0c;Document对象的常用方法六&#…

配置PPPoE拨号双链路负载分担示例

配置PPPoE拨号双链路负载分担示例 组网需求 如图1所示&#xff0c;设备作为企业出口网关&#xff0c;通过PPPoE拨号双上行接入Internet&#xff0c;链路1和链路2的出口路由采用等价路由进行负载分担。设备上配置NAT实现企业私网用户访问Internet。 图1 设备作为PPPoE Client…

MySQL 实战(一):实现“附近的人”功能

❤️ 个人主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;MySQL 教程&#xff1a;从入门到精通 文章目录 ST_Distance_Sphere 函数示例一&#xff1a;计算北京站到北京西站的距…

Neo4j实现表字段级血缘关系

需求背景 需要在前端页面展示当前表字段的所有上下游血缘关系&#xff0c;以进一步做数据诊断治理。大致效果图如下&#xff1a; 首先这里解释什么是表字段血缘关系&#xff0c;SQL 示例&#xff1a; CREATE TABLE IF NOT EXISTS table_b AS SELECT order_id, order_status F…

分布式数据库架构:高可用、高性能的数据存储

在现代信息时代&#xff0c;数据是企业发展的核心。为了支持海量数据的存储、高并发访问以及保证数据的可靠性&#xff0c;分布式数据库架构应运而生。分布式数据库架构是一种将数据存储在多个物理节点上&#xff0c;并通过一系列复杂的协调和管理机制来提供高可用性和高性能的…

云农场种植:互联网+智慧牧场,为农业注入新的活力和创新

随着科技的不断发展&#xff0c;数字化农业正逐渐成为现代农业的趋势。传统农业面临着土地资源有限、劳动力不足等问题&#xff0c;而云农场种植模式通过数字化技术的运用&#xff0c;互联网养殖着重于“绿色、特色产品和智慧生态”&#xff0c;通过建立“线上养殖线下托养线上…

配置NTP时间服务器

1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 ​ 客户端主机 同步成功 2.配置ssh免密登陆&#xff0c;能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接

【严重】Coremail 远程命令执行漏洞

漏洞描述 Coremail是广东盈世计算机科技有限公司推出的一款大型企业邮件系统。 在 Coremail XT5/XT6 版本中&#xff0c;邮件处理功能存在溢出风险&#xff0c;攻击者构造恶意邮件&#xff0c;向任意邮箱地址发送该恶意邮件&#xff0c;当服务器处理邮件时&#xff0c;会触发…

凯迪正大—直流电阻测试仪

一、产品概述 武汉凯迪正大直流电阻测量仪是变压器制造中半成品、成品出厂试验、安装、交接试验及电力部门预防性试验的必测项目&#xff0c;能有效发现变压器线圈的选材、焊接、连接部位松动、缺股、断线等制造缺陷和运行后存在的隐患。 为了满足变压器直流电阻测量的需要&a…

浏览器原生的 画中画 特性

Chrome 116 作为Google浏览器的最新稳定版本已正式发布。Chrome 浏览器支持视频画中画&#xff08;HTMLVideoElement&#xff09;已有一段时间&#xff0c;而 Chrome 116 则新增了文档画中画模式。这种"文档画中画"模式提供了一个始终在顶部的窗口&#xff0c;可以填…

sql server 、mysql CTE 公用表表达式

sql server 详细 mysql CTE CTE 是一个命名的临时结果集&#xff0c;作用范围是当前语句。CTE可以理解成一个可以复用的子查询&#xff0c;当然跟子查询还是有点区别的&#xff0c;CTE可以引用其他CTE&#xff0c;但子查询不能引用其它子查询。所以&#xff0c;开发中建议…

新高-新低指数(NH-NL)指标公式,判断多空力度

在《以交易为生》这本书中&#xff0c;作者埃尔德根据其经验&#xff0c;认为新高-新低指数(NH-NL)是股市的最佳领先指标。在任意一天中&#xff0c;创一年新高的股票是强势股&#xff0c;而创一年新低的股票是弱势股。新高-新低指数通过比较强势股和弱势股的数量来跟踪市场领导…