Spring Boot如何实现配置文件的自动加载和刷新?

news2024/11/28 14:30:57

Spring Boot如何实现配置文件的自动加载和刷新?

在使用Spring Boot开发应用程序时,配置文件是非常重要的组成部分。在不同的环境中,我们可能需要使用不同的配置文件,例如在开发、测试和生产环境中使用不同的配置文件。而且,当我们更改配置文件时,我们希望应用程序能够自动加载和刷新配置文件,而无需重启应用程序。在这篇文章中,我们将探讨Spring Boot如何实现配置文件的自动加载和刷新。

在这里插入图片描述

Spring Boot的配置文件

Spring Boot使用基于属性的配置文件,通常是YAML或Properties格式的文件。这些配置文件包含应用程序的配置信息,例如数据库连接信息、日志配置、端口号等。

在Spring Boot中,配置文件的默认名称为application.ymlapplication.properties。Spring Boot会在应用程序启动时自动加载这些配置文件,并将它们解析为一个名为Environment的对象。我们可以使用Environment对象获取配置文件中的属性值。

自动加载配置文件

在Spring Boot中,配置文件的自动加载是默认启用的。这意味着当应用程序启动时,Spring Boot会自动加载application.ymlapplication.properties配置文件,并将其转换为Environment对象。我们可以使用@Value注解或Environment对象来获取配置文件中的属性值。

例如,我们可以在application.yml文件中设置应用程序的端口号:

server:
  port: 8080

然后在代码中使用@Value注解获取端口号:

@Value("${server.port}")
private int port;

这样就可以在代码中获取到端口号的值了。

配置文件的刷新

当我们更改配置文件时,我们希望应用程序能够自动加载和刷新配置文件,而无需重启应用程序。Spring Boot提供了两种方式实现配置文件的刷新:基于轮询和基于Webhook。

基于轮询的配置文件刷新

基于轮询的配置文件刷新是Spring Boot默认提供的一种方式。Spring Boot会定期轮询配置文件的修改时间,如果发现配置文件被修改,则会重新加载配置文件。

默认情况下,Spring Boot会每隔5秒钟轮询一次配置文件的修改时间。我们可以通过设置spring.cloud.refresh.interval属性来更改轮询间隔时间。例如,将轮询间隔时间设置为10秒:

spring:
  cloud:
    refresh:
      interval: 10s

在代码中,我们可以使用@RefreshScope注解来标记需要刷新的Bean。当配置文件发生变化时,这些Bean将被重新创建。

例如,我们有一个名为MyService的服务类:

@Service
@RefreshScope
public class MyService {
    @Value("${my.config}")
    private String config;

    // ...
}

当我们更改application.yml文件中的my.config属性时,Spring Boot会自动重新加载配置文件,并重新创建MyService类的实例。在重新创建实例时,config属性的值也将被更新。

基于Webhook的配置文件刷新

基于Webhook的配置文件刷新是另一种实现配置文件刷新的方式。与基于轮询的刷新不同,基于Webhook的刷新方式是在配置文件发生变化时,由另一个应用程序发送HTTP请求通知当前应用程序刷新配置文件。

要启用基于Webhook的配置文件刷新,我们需要引入spring-cloud-starter-config依赖,并在application.ymlapplication.properties配置文件中设置以下属性:

spring:
  cloud:
    config:
      server:
        git:
          uri: <git仓库地址>
          username: <用户名>
          password: <密码>
          search-paths: <配置文件路径>
          clone-on-start: true
      label: <git分支>
      refresh:
        enabled: true

其中,uri属性指定了配置文件所在的Git仓库地址,usernamepassword属性是Git仓库的登录信息,search-paths属性指定了配置文件所在的路径,clone-on-start属性表示在应用程序启动时是否从Git仓库克隆配置文件。label属性指定了Git仓库的分支名称,refresh.enabled属性表示是否启用配置文件的自动刷新。

在配置完成后,我们需要创建一个Webhook来通知应用程序刷新配置文件。我们可以使用GitHub或GitLab等代码托管平台的Webhook功能,将其配置为在配置文件发生变化时向应用程序发送HTTP请求。

当应用程序接收到Webhook请求时,Spring Boot会自动从Git仓库中拉取最新的配置文件并重新加载。我们可以使用@RefreshScope注解来标记需要刷新的Bean,当配置文件发生变化时,这些Bean将被重新创建。

注意事项

在使用配置文件自动刷新功能时,有一些需要注意的事项:

  1. 配置文件中的属性必须使用@Value注解或Environment对象来获取,否则在配置文件刷新后,应用程序中的属性值将不会更新。
  2. 配置文件中的属性必须使用@RefreshScope注解来标记需要刷新的Bean,否则在配置文件刷新后,应用程序中的Bean实例将不会更新。
  3. 在使用基于Webhook的配置文件刷新时,需要注意Git仓库的访问权限和安全性,避免敏感信息泄露。

示例代码

下面是使用Spring Boot实现配置文件自动加载和刷新的示例代码。假设我们有一个名为MyService的服务类,它依赖于配置文件中的my.config属性:

@Service
@RefreshScope
public class MyService{
    @Value("${my.config}")
    private String config;

    public String getConfig() {
        return config;
    }
}

application.yml文件中,我们设置了my.config属性的值为default

my:
  config: default

现在,我们可以使用MyService类的getConfig()方法来获取my.config属性的值。

基于轮询的配置文件刷新

为了演示基于轮询的配置文件刷新,我们将设置轮询间隔时间为10秒,并在10秒后更改my.config属性的值。在application.yml文件中,添加以下配置:

spring:
  cloud:
    refresh:
      interval: 10s

在代码中,我们需要使用@RefreshScope注解标记MyService类,以便在配置文件发生变化时重新创建实例。然后,我们使用一个ScheduledExecutorService定期更改my.config属性的值:

@Service
@RefreshScope
public class MyService {
    @Value("${my.config}")
    private String config;

    public String getConfig() {
        return config;
    }
}

@SpringBootApplication
public class Application {
    private static final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

   // 定义一个计数器,用于记录更改次数
    private static int count = 0;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        // 每隔10秒更改一次my.config属性的值
        executor.scheduleWithFixedDelay(() -> {
            count++;
            String newValue = "value_" + count;
            System.out.println("Changing my.config to " + newValue);
            System.setProperty("my.config", newValue);
        }, 0L, 10L, TimeUnit.SECONDS);
    }
}

在应用程序启动后,MyService类的实例将被创建,并获取my.config属性的值为default。然后,每隔10秒钟,定时任务会更改my.config属性的值,并输出日志。在日志中,我们可以看到每次更改属性值后,MyService类的实例也会重新创建,并获取新的属性值。

基于Webhook的配置文件刷新

为了演示基于Webhook的配置文件刷新,我们需要将配置文件存储在Git仓库中,并配置Webhook通知应用程序刷新配置文件。假设我们将配置文件存储在名为my-config的Git仓库中,分支名称为main,配置文件路径为/config/application.yml。然后,我们需要配置应用程序以从Git仓库中拉取配置文件,并启用配置文件的自动刷新。

application.yml文件中,添加以下配置:

spring:
  cloud:
    config:
      server:
        git:
          uri: <Git仓库地址>
          username: <用户名>
          password: <密码>
          search-paths: /config
      label: main
      refresh:
        enabled: true

其中,uri属性指定了Git仓库的地址,usernamepassword属性是Git仓库的登录信息,search-paths属性指定了配置文件所在的路径。label属性指定了Git仓库的分支名称,refresh.enabled属性表示是否启用配置文件的自动刷新。

在代码中,我们需要使用@RefreshScope注解标记MyService类,以便在配置文件发生变化时重新创建实例。然后,我们可以使用一个@Scheduled注解的方法定期输出my.config属性的值:

@Service
@RefreshScope
public class MyService {
    @Value("${my.config}")
    private String config;

    public String getConfig() {
        return config;
    }
}

@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Autowired
    private MyService myService;

    @Scheduled(fixedRate = 5000)
    public void printConfig() {
        System.out.println("my.config = " + myService.getConfig());
    }
}

在应用程序启动后,MyService类的实例将被创建,并获取my.config属性的值。然后,定时任务将定期输出my.config属性的值。

现在,我们可以在my-config仓库中更改application.yml文件中的my.config属性的值,并推送更改到远程仓库。然后,我们可以在GitHub或GitLab等代码托管平台上配置Webhook,将其配置为在配置文件发生变化时向应用程序发送HTTP请求。当应用程序接收到Webhook请求时,Spring Boot会自动从Git仓库中拉取最新的配置文件,并重新加载。在重新加载配置文件时,MyService类的实例也将被重新创建,并获取新的属性值。我们可以在应用程序的控制台输出中看到,每次更改配置文件后,定时任务输出的my.config属性值也会相应地更新。

总结

在本文中,我们介绍了Spring Boot如何实现配置文件的自动加载和刷新。配置文件是应用程序的重要组成部分,而配置文件的自动加载和刷新可以使应用程序更加灵活和可配置。我们讨论了基于轮询和基于Webhook的配置文件刷新方式,并给出了相应的示例代码。在实践中,我们需要注意一些细节,例如配置文件中属性的获取方式、Bean的刷新方式、Git仓库的访问权限和安全性等。希望本文能够对大家理解Spring Boot的配置文件自动加载和刷新有所帮助。

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

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

相关文章

功能测试转到自动化测试,我的测试之路“狂飙”~20k...

前言 Python自动化测试&#xff1a;Python自动化测试&#xff0c;7天练完这60个实战项目&#xff0c;年薪过35w。 手动功能测试人员应该权衡测试自动化相对于功能测试的好处&#xff0c;并且即可开始行动。现在随着测试行业的发展&#xff0c;自动化测试已经成为每个测试人的标…

nodejs+vue大学生招聘网站应聘系统设计与实现5b14b

目前&#xff0c;伴随着Internet技术的日益成熟&#xff0c;互联网需要提供更多的服务&#xff0c;发达国家已形成以信息技术为核心&#xff0c;招聘网站支撑的现代化招聘公司技术格局。这便是今天为大家所熟悉的管理信息系统,网络发展为招聘网站实现信息化、自动化、智能化和集…

牛客小白月赛73DE

问题很好转化&#xff0c;但是对区间的处理没把握好&#xff0c;一直在纠结怎么o&#xff08;n&#xff09; 一开始想到二分了&#xff0c;但是没细想&#xff0c;结果看了讲解发现&#xff0c;其实就是一个前缀数组上对区间的查询的操作&#xff0c;以后再遇到此类问题直接向…

Git提交提交代码报错 Push failed unable to access

目录 场景 环境&#xff1a; Git配置 场景 Push failed unable to access https://github.com/1790753131/remotRepository3.git/: Failed to connect to github.com port 443 after 21114 ms: Couldnt connect to server Push failed unable to ac…

计算节点与存储设备是如何连接的?

本文是《数据存储通识课》合集的一部分,本合集希望通过一系列文章科普数据存储相关技术内容。同时,本系列文章不仅仅是科普,还会进行有深度解析,理论结合实现,从代码实现层面进行剖析。欢迎关注“数据存储张”,老张是深耕存储十几载,就业于存储No1公司的资深工程师。 无…

Keil 5 MDK 发律师函警告了,如何用STCubeIDE开发标准库的程序(STM32F103C8T6为例)

用STCubeIDE进行标准库开发 1、CubeIDE介绍 https://www.stmcu.com.cn/ecosystem/Cube/STM32CubeIDE 2、CubeIDE下载 点击上面的链接&#xff0c;登录即可下载 3、搭建Demo工程 新建一个工作空间 创建一个工程 选择芯片-STM32F103C8T6 填写工程信息 添加标准库到工程 标…

【数据结构与算法】图论及其相关算法

文章目录 图的基本介绍图的表示方式邻接矩阵邻接表 图的深度优先遍历(DFS)概述实现步骤代码实现 图的广度优先遍历(BFS)概述实现步骤代码实现 图的常用代码汇总最小生成树算法普里姆&#xff08;Prim&#xff09;算法算法实践 克鲁斯卡尔&#xff08;Kruskal&#xff09;算法并…

西南交通大学智能监测 培训课程练习2

2023.05.27培训 task1&#xff1a;spring、springboot task2&#xff1a;mybatis 目录 一、使用IDEA创建工程 1.1新建 ​编辑 1.2选择Maven 1.3创建包 二、添加相关依赖 2.1添加依赖 2.2更新Maven 三、配置application.yaml文件 四、相关注解的使用和理解 4.1Componen…

华硕天选3FX507ZC原装Windows11原厂预装系统工厂模式恢复安装带ASUSRecevory一键还原22H2版本

华硕天选3FX507ZC原装Windows11原厂预装系统工厂模式恢复安装带ASUSRecevory一键还原 文件地址&#xff1a;https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd8888 华硕工厂恢复系统 &#xff0c;安装结束后带隐藏分区以及机器所有驱动软件 需准备一个16G左右空u盘进行…

倒置字符串、猜名次、猜凶手、杨辉三角

目录 例一&#xff1a;倒置字符串 例二&#xff1a;猜名次 例三&#xff1a;猜凶手 例四&#xff1a;杨辉三角 方法一 方法二 例一&#xff1a;倒置字符串 首先我们先来看一下题目具体要求 再来看一下我们所需要的效果 这里呢&#xff0c;博主给出两种思路&#xff0c;…

docker构建镜像上传到DockerHub

docker构建镜像上传到DockerHub DockerHub注册账号 DockerHub网址: https://hub.docker.com/ 注册 登录 安装docker docker宿主机环境 centos7 参考网址: https://yeasy.gitbook.io/docker_practice/install/centos 测试 docker 是否安装好 docker -v登录docker 登录 dock…

自动化测试3:Junit单元测试框架

目录 1.相关技术 1.1注解 1.1.1Test 1.1.2Disables 忽略 1.1.3BeforeAll AfterAll 1.1.4BeforeEach AfterEach 1.2参数化 1.2.1单参数 1.2.2多参数 1.2.3CSV获取参数 1.2.4方法获取参数 1.3运行顺序 1.3.1问题 1.3.2按指定顺序执行 1.3.3随机执行 1.4.断言 2.测…

webpack的使用

一、什么是webpack&#xff1f; webpack是一个前端构建工具&#xff0c;目前比较主流的构建工具&#xff0c;自定义的模块比较多。 二、应用场景 vue、react、angular 都可以通过webpack构建全部可供访问的页面数量不超过500个 三、安装 通过npm方式在项目根目录下执行命令…

spring官网guide案例直接运行

spring官网guide案例可以直接运行 spring guide 的案例基本包含 spring 以及 springboot 很多功能的案例 具体网址: https://spring.io/guides 我们使用 GitHub CodeSpaces 或者 GitPod 甚至不需要 git clone 代码到本地 , 可以直接在线运行 GitHub CodeSpacesGitPod 说明:…

SpringBoot 如何实现文件上传和下载

当今Web应用程序通常需要支持文件上传和下载功能&#xff0c;Spring Boot提供了简单且易于使用的方式来实现这些功能。在本篇文章中&#xff0c;我们将介绍Spring Boot如何实现文件上传和下载&#xff0c;同时提供相应的代码示例。 文件上传 Spring Boot提供了Multipart文件上…

Java 集合 - Map 接口

文章目录 1.概述2.常用 API3.遍历 Map 集合4.HashMap 和 Hashtable5.LinkedHashMap6.TreeMap7.Properties8.Set 集合与 Map 集合的关系9.总结 1.概述 在日常生活和编程中&#xff0c;我们常常需要处理一种特殊的关系&#xff1a;一一对应的关系&#xff0c;如 IP 地址与主机名…

深入浅出Docker:Java开发者的快速上手指南

前言1. Docker是什么&#xff1f;2. 安装Docker3. 使用Docker容器运行Java应用4. 使用Docker部署Java Web应用5. 总结 前言 在今天的软件开发环境中&#xff0c;Docker已经成为了一种常见的开发和部署工具。无论你是前端开发者、后端开发者&#xff0c;还是DevOps工程师&#…

【C++系列P3】‘类与对象‘-三部曲——[基础知识](1/3)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 C系列 &#xff0c;热烈欢迎&#xff01; 【 类与对象-三部曲】的大纲主要内容如下&#xff1a; 如标题所示&#xff0c;本章是【 类与对象-三部曲】三章中的第一章节——基础知识章节&#xff0c;主要内容如下&#xff1a; 目录 一.…

Redis(五)发布与订阅

文章目录 1、什么是发布与订阅2、指令与描述3、指令测试 1、什么是发布与订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。 Redis 的 subscribe 命令可以让客户端订阅任意数量的频道&#xff0c; 每当…

一文带你了解MySQL之事务的简介

前言&#xff1a; 事务&#xff08;Transaction&#xff09;是一组SQL组成的执行单元&#xff08;Unit&#xff09;&#xff0c;是数据库并发控制和恢复回滚的基本单位。一个事务中可能包含多个SQL&#xff0c;要么都失败&#xff0c;要么都成功&#xff0c;今天我们就详细学习…