Spring Boot实现配置文件的自动加载和刷新功能
作者:Sun?3285 发布时间:2023-07-14 02:26:55
Spring Boot如何实现配置文件的自动加载和刷新?
在使用Spring Boot开发应用程序时,配置文件是非常重要的组成部分。在不同的环境中,我们可能需要使用不同的配置文件,例如在开发、测试和生产环境中使用不同的配置文件。而且,当我们更改配置文件时,我们希望应用程序能够自动加载和刷新配置文件,而无需重启应用程序。在这篇文章中,我们将探讨Spring Boot如何实现配置文件的自动加载和刷新。
Spring Boot的配置文件
Spring Boot使用基于属性的配置文件,通常是YAML或Properties格式的文件。这些配置文件包含应用程序的配置信息,例如数据库连接信息、日志配置、端口号等。
在Spring Boot中,配置文件的默认名称为application.yml
或application.properties
。Spring Boot会在应用程序启动时自动加载这些配置文件,并将它们解析为一个名为Environment
的对象。我们可以使用Environment
对象获取配置文件中的属性值。
自动加载配置文件
在Spring Boot中,配置文件的自动加载是默认启用的。这意味着当应用程序启动时,Spring Boot会自动加载application.yml
或application.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.yml
或application.properties
配置文件中设置以下属性:
spring:
cloud:
config:
server:
git:
uri: <git仓库地址>
username: <用户名>
password: <密码>
search-paths: <配置文件路径>
clone-on-start: true
label: <git分支>
refresh:
enabled: true
其中,uri
属性指定了配置文件所在的Git仓库地址,username
和password
属性是Git仓库的登录信息,search-paths
属性指定了配置文件所在的路径,clone-on-start
属性表示在应用程序启动时是否从Git仓库克隆配置文件。label
属性指定了Git仓库的分支名称,refresh.enabled
属性表示是否启用配置文件的自动刷新。
在配置完成后,我们需要创建一个Webhook来通知应用程序刷新配置文件。我们可以使用GitHub或GitLab等代码托管平台的Webhook功能,将其配置为在配置文件发生变化时向应用程序发送HTTP请求。
当应用程序接收到Webhook请求时,Spring Boot会自动从Git仓库中拉取最新的配置文件并重新加载。我们可以使用@RefreshScope
注解来标记需要刷新的Bean,当配置文件发生变化时,这些Bean将被重新创建。
注意事项
在使用配置文件自动刷新功能时,有一些需要注意的事项:
配置文件中的属性必须使用
@Value
注解或Environment
对象来获取,否则在配置文件刷新后,应用程序中的属性值将不会更新。配置文件中的属性必须使用
@RefreshScope
注解来标记需要刷新的Bean,否则在配置文件刷新后,应用程序中的Bean实例将不会更新。在使用基于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仓库的地址,username
和password
属性是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
属性值也会相应地更新。
来源:https://blog.csdn.net/taiyang3285/article/details/130835996


猜你喜欢
- 注入集合(数组、List、Map、Set)类型属性(1)创建类,定义数组,list,map,set类型属性,并且生成对应的set方法。(2)
- 公司有一个需求,实现一个多级的树形菜单,并且支持多选功能,实现这个功能之前,我在网上找了找,树形菜单很好找,但是支持多选功能并没有很合适的,
- 本文实例讲述了Android开发实现读取Assets下文件及文件写入存储卡的方法。分享给大家供大家参考,具体如下:调用一个反编译的.so文件
- Spring或SpringBoot开启事务以后无法返回自增主键场景:保存订单和订单详情,订单详情需要订单id,数据库中的订单表是自增主键,开
- java读取文件里面部分汉字内容乱码读取一个txt文件,到代码中打印出来,发票有部分汉字的内容是乱码的。我开始的方式是这样的, 如下,这是完
- 主要思路就是提供者持有密钥,通过RSA加密客户机标识或时间标识,再通过Base64加密成不太难看的注册码,然后分发给客户机。客户机解Base
- 一、线程优先级的介绍java 中的线程优先级的范围是1~10,默认的优先级是5。“高优先级线程”会优先于“低优先级线程”执行。java 中有
- springboot+mybatis+前端vue,使用前后端分离架构实现的个人博客系统,共7个模块,首页,写博客,博客详情页,评论管理,文章
- 一、需求C# 项目生成 dll,在反编译工具下,好比皇帝的新装,dll 内部的代码看的一清二楚,在这里推荐一个工具ConfuserEx,可以
- 1. 前言Compose 具有超强的兼容性,兼容现有的所有代码,Compose 能够与现有 View 体系并存,可实现渐进式替换。这就很有意
- 对话框(Dialog)是Android系统在Activity或者其他组件运行过程中提供的一种提示机制。它可以帮助应用完成一些必要的提示功能,
- Spring Boot简介Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开
- 继承(加上封装和多态性)是面向对象的编程的三个主要特性(也称为“支柱”)之一。 继承用于创建可重用、扩展和修改在其他类中定义的行为的新类。其
- 使用OptionMenu只要重写两个方法public boolean onCreateOptionsMenu(Menu menu):菜单的初
- 前面我们讲到了Spring在进行事务逻辑织入的时候,无论是事务开始,提交或者回滚,都会触发相应的事务事件。本文首先会使用实例进行讲解Spri
- 对其做了些优化,但此种sql生成方式仅适用于复杂程度不高的sql,所以实用性不是很高,仅仅是写着玩的,知道点mybatis的注解形式的使用方
- 前言Spring JPA是目前比较常用的ORM解决方案,但是其对于某些场景并不是特别的方便,例如查询部分字段,联表查询,子查询等。而接下来我
- 目录一、Actuator简介二、与SpringBoot2.0整合 1、核心依赖Jar包2、Yml配置文件三、监控接口详解 
- 使用GridView实现表格分割线效果,网格布局表格布局也是可以实现的。效果如下:1.主函数代码:package com.example.q
- 本文实例讲述了C#调用存储过程的方法。分享给大家供大家参考,具体如下:CREATE PROCEDURE [dbo].[GetNameById