Springboot使用纪要

一、配置文件的加载顺序

1、不同配置文件类型的加载顺序

springboot支持三种类型的配置文件

.yml
.yaml
.properties

当这三种配置文件处于同一目录下时,springboot会优先加载properties文件,如果.properties文件和.yml文件都有某一配置,而它们又处于同一目录下,那么springboot会使用.properties的配置;只有当.properties中没有某些配置时,它才会去采用.yml的这些配置。

2、项目包内-不同位置的配置文件的加载顺序(以下均以yml文件为例)

项目启动后扫描顺序:
1、先去项目根目录的config文件夹下找配置文件;
2、再去项目根目录下找配置文件;
3、再去项目resources下的config文件夹下找配置文件;
4、再去项目resources下找配置文件;

相同的配置项,springboot会以加载到的内容为准;
不同的配置项,springboot会对多个配置采取并集的操作;

上述介绍的配置文件都处于项目内部,它们在项目打包时都会被打进jar包,如果想要更改,需要重新打包。

3、项目包外-不同位置的配置文件的加载顺序

有的时候,有些配置在开发时并不知道内容为何;或者有些配置,需要在上线后的某个时刻再作修改;这时如果用上面的配置文件,那就需要重新改配置文件、打包、发版了,很麻烦。

springboot在打包时不会把项目的上级、或上级的config文件夹打入jar包(即./ 或 ./config),但是它会读取这两个地方的配置文件,而且它的读取优先级在包内配置文件之前;这个设计很巧妙,它解决了我们无法动态修改项目配置的痛点。

不同位置配置文件加载顺序总结

springboot加载配置文件的总顺序:
1、先加载包外上一级的config文件夹下的配置文件;
2、再加载包外上一级的配置文件;
3、先去项目根目录的config文件夹下找配置文件;
4、再去项目根目录下找配置文件;
5、再去项目resources下的config文件夹下找配置文件;
6、再去项目resources下找配置文件;

生产应用实例

公司有一个容器部署平台,我刚入职不久就听同事说,该平台下的configMap可以实现动态刷新配置;你给项目配置好configMap,后面有需要改的配置,只需要在configMap中修改一下配置文件、再伸缩一下容器实例,新改的配置内容就可以生效了。

过了几天,我接到开发任务,给一个项目配置configMap;
我仿照其它项目,进行了配置,主要有两个个部分:
一是,在容器平台新增一个configMap项,在里面把现在的application.yml配置上去;
二是,在项目的deploy.yaml中进行配置,这个deploy.yaml文件用于告诉容器平台,我都有哪些配置,它们的位置应该在容器的哪里。

接着进行测试,但是发现配置并未生效,比如我把项目的数据库名称故意改错,伸缩实例后项目仍可正常运行;再比如,我专门写一个测试接口,其功能就是读取某个配置项的内容,我在configmap中把这个配置项作了修改,但是调接口返回的仍然是没改之前的值;最后,我甚至清空了configMap中application.yml的内容,但是项目还是能正常运行…

我找了容器平台的同事给帮忙看看怎么回事,他们排查以后,告诉我,我的configMap配置没问题,已经生效了;它们的configMap只是保证在这里配置的内容,会在容器内、deploy.yaml指定的位置生成一个对应的文件,而且该容器内文件的内容会随着configMap对应内容的修改而修改。我的配置,现在就已经是这样了,至于接口返回值没变、数据库名改错页面也正常,这就是代码的问题了,不关他们平台的事情。

后来经过艰苦卓绝的思考,我终于想明白了;
其实之前同事说的configMap动态同步配置的功能是真的,但它不是configMap实现的、或者说不是configMap单独实现的;
它其实就是springboot加载配置文件的顺序决定的。
你只要把配置文件放在springboot会加载的地方,而且保证它比项目的application配置文件先加载,那么久可以实现动态修改配置文件;
而项目的配置文件都是放在resources下边的,我们只要把配置文件放在包外的config文件夹下不就可以了。

事实上,正是如此,我的configMap配置之所以“没生效”,就是因为configMap哪里的配置文件位置不能随意指定,它必须在包的上一级/上一级的config文件夹下,这样它才能即不用重新打包就可以让springboot读取到、又能比包内的resources文件夹下的配置文件先被读到。
而公司容器平台的configMap确实如同事所说,它只是为了你修改配置文件方便,你在configMap页面修改了,人家给你同步到容器指定的位置的文件中,至于项目读不读就不算configMap管的了。

4、通过启动命令,指定配置文件的位置

如果外部的配置文件不想放在默认的位置,可以在启动命令中,用–spring.config.location指定配置文件的位置

# 正常的启动命令
java -jar xx-1.0.0.jar --server.port=8082# 指定配置文件位置的启动命令
java -jar xx-1.0.0.jar --server.port=8082 --spring.config.location=./test/application.yml

二、springboot常用功能

1、定时任务

1)按一定频率循环触发的定时任务

对于该类型的定时任务,springboot的实现方式非常简单,只需要两步:
第一步,在启动类添加@EnableScheduling注解,使定时任务可用;
第二步,在需要定时执行的方法上加@Scheduled注解,开启定时任务,例如:

@Component
public class GlobalTokenManager {@Scheduled(fixedRate = 82800000) // 每23小时刷新一次tokenpublic void scheduledRefreshToken() throws BusinessException {refreshToken();}
}

2)需要特定行为触发的定时任务

有时候,我们需要的不是按固定时间间隔执行某任务,而是在A事件发生后,开启定时,定时结束执行B事件,结束。

这种情况可以用ScheduledExecutorService 来实现,在需要开启定时的地方新建一个ScheduledExecutorService ,其具体使用方式参考如下实例

		// 开启定时任务,让车辆等待5分钟ScheduledExecutorService executor = executorConfig.initScheduledExecutor();Runnable task = new Runnable() {@Overridepublic void run() {// 5分钟结束,执行场景三的逻辑notificationParamsDto.setOrderId(order.getOrderId());notificationParamsDto.setTaskId(mqttMessageBodyVO.getTaskId());notificationService.senderDidNotArriveNotification(notificationParamsDto);}};executor.schedule(task, 5*60, TimeUnit.SECONDS);

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

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

相关文章

Unity协程机制详解

Unity的协程(Coroutine)是一种异步编程的机制,允许在多个帧之间分割代码的执行,而不阻塞主线程。与传统的多线程不同,Unity的协程在主线程中运行,并不会开启新的线程。 什么是协程? 协程是一种…

electron 打包 webview 嵌入需要调用电脑摄像头拍摄失败问题

electron 打包 webview 嵌入需要调用电脑摄像头拍摄失败问题 这篇文章是接我cocos专栏的上一篇文章继续写的,我上一篇文章写的是 cocos 开发触摸屏项目,需要嵌入一个网页用来展示,最后通过 electron 打包成 exe 程序,而且网页里面…

Android 开发者选项-模拟辅助显示设备

目录 概述使用开关的代码实现方式系统部分的处理:参考 概述 在Android开发中,模拟辅助显示设备通常指的是通过Android开发者选项来设置的一种虚拟显示设备,它允许开发者在一个设备上模拟另一个设备的显示特性。这种功能对于测试应用程序在不同屏幕尺寸、…

android 常用三方框架

说实话, 我是比较讨厌三方框架的, 比如一个eventbus 底层逻辑就是个观察者模式,当然他的场景涵盖的比较丰富, 单从 单一原则来说, 还是一个简单的观察者模式就能解决问题, 何必要添加那么多文件到我们的项目…

[COLM 2024] V-STaR: Training Verifiers for Self-Taught Reasoners

本文是对 STaR 的改进方法,COLM 是 Conference On Language Models,大模型领域新出的会议,在国际上很知名,不过目前还没有被列入 ccf list(新会议一般不会列入);作者来自高校、微软研究院和 Goo…

从C#中的结构体和类的区别中看引用和值的问题

在 C#中,结构体(struct)和类(class)都是用于创建自定义数据类型的方式,但它们在很多方面存在着显著的区别。掌握他们的区别至少不会产生一些我们不了解情况下发生的错误。 文章目录 一、作为参数传递时的差…

Spann3R:基于DUSt3R的密集捕获数据增量式重建方法

来自作者Hengyi Wang在b站3D视觉工坊中对于该论文透彻的讲解,这里是相关重要部分的截屏。这篇博客的用途主要是自己做记录,其次分享给感兴趣的同学,最后谢谢作者大佬的认真讲解。 作者是按照这样的次序来介绍的: 首先从传统的三…

Python4-分支与循环

记录python学习,直到学会基本的爬虫,使用python搭建接口自动化测试就算学会了,在进阶webui自动化,app自动化 python基础3-分支与循环语句 python中 有哪些基本值是被当作true或者false的呢?if语句示例被视为 False 的情况被视为…

SAP-ABAP开发学习-面向对象OOALV(1)

本文目录 一、概述 面向对象开发特点 二、类与对象 程序中类的创建 Class构成要素 对象 方法 一、概述 随着SAP R/3 4.0版本的开发,ABAP语言开始引入了面向对象的开发概念。这在ABAP语言的发展过程中,面向对象(Object-oriented&#…

【实用技能】如何在 .NET C# 中的邮件合并过程中操作表格单元格

TX Text Control 中的邮件合并 类是一个强大的库,旨在通过将数据合并到模板中来自动创建文档。它充当结构化数据(例如来自数据库、JSON 或 XML)和动态文档生成之间的桥梁,对于需要自动化文档工作流程的应用程序来说非常有用。 TX…

有源模拟滤波器的快速设计

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、概述 几乎所有电子电路中都能看到有源模拟滤波器的身影。音频系统使用滤波器进行频带限制和平衡。通信系统设计使用滤波…

如何使用Python库连接Redis

1、redis-py 库封装一个 Redis 工具类可以帮助我们简化 Redis 的操作并提高代码的复用性和可维护性。 安装redis pip install redisimport redis import logginglogging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__)class RedisUtils:def __init__(s…

【代码随想录day57】【C++复健】 53. 寻宝(prim算法);53. 寻宝(kruskal算法)

53. 寻宝(prim算法) 好像在研究生的算法课上学过prim算法和kruskal算法,不过当时只是了解了一下大致的概念和流程,并没有涉及到如何去写代码的部分,今天也算是学习了一下这两个算法的代码应该如何去实现,还…

使用OpenTK展示3D点云图像(C#)

最近在研究3D显示,找到一款在winform上展示3D点云的控件,并且实现了点线面的展示,及光照渲染纹理贴图等功能,如下面几张图所展示。 一些基础知识可以在LearnOpenTK - OpenTK 这个网站上学习到。 我这边使用的是openTK3.3.3版本&a…

MetaGPT源码 (Memory 类)

目录 MetaGPT源码:Memory 类例子 MetaGPT源码:Memory 类 这段代码定义了一个名为 Memory 的类,用于存储和管理消息(Message)对象。Memory 提供了多种操作消息的功能,包括添加单条或批量消息、按角色或内容筛选消息、删除最新消息…

pythonOpenCV篇:0基础带你python入门之常用函数

① 二值化函数 功能:将图像转换为二值图像(黑白图像),将像素值分为两种类别:前景(白)和背景(黑)。函数:cv2.threshold()参数: src:输…

小发现,如何高级的顺序输出,逆序输出整数的每一位(栈,队列)

当我还是初学者的时候,我经常思考有没有比慢慢求每一位数字然后考虑正序,逆序输出要快的办法...长期琢磨,必有所获! 我刚学数据结构的时候还没意识到栈,队列还能这样用,虽然说有点杀鸡用牛刀的感觉&#x…

详细解析RNNoise:基于深度学习的语音噪声抑制技术

引言 在语音通信、语音识别以及音频处理领域,噪声抑制是一个至关重要的任务。环境噪声,如风声、交通声和人群声,通常会影响语音的清晰度和质量,特别是在远程通信和在线会议中。为了提高语音质量,许多噪声抑制技术应运…

【笔记】架构上篇Day6 法则四:为什么要顺应技术的生命周期?

法则四:为什么要顺应技术的生命周期? 简介:包含模块一 架构师的六大生存法则-法则四:为什么要顺应技术的生命周期?&法则四:架构设计中怎么判断和利用技术趋势? 2024-08-29 17:30:07 你好&am…

跟李笑来学美式俚语(Most Common American Idioms): Part 66

Most Common American Idioms: Part 66 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记,自用。 Github仓库链接:https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来(或者clone到本地…