【Spring Boot】配置实战指南:Properties与YML的深度对比与最佳实践
目录
1.前言
2.正文
2.1配置文件的格式
2.2properties
2.2.1基础语法
2.2.2value读取配置文件
2.2.3缺点
2.3yml
2.3.1基础语法
2.3.2配置不同数据类型
2.3.3配置读取
2.3.4配置对象和集合
2.3.5优缺点
2.4综合练习:验证码案例
2.4.1分析需求
2.4.2接口
2.4.3介绍hutool
2.4.4代码实现
2.4.4.1后端实现
2.4.4.2前端核心实现
3.小结
1.前言
哈喽大家好吖,在Spring Boot项目中,配置文件是连接代码与环境的桥梁,直接影响着应用的可维护性和扩展性。面对传统的Properties格式与新兴的YAML格式,开发者该如何选择?它们的语法差异是什么?如何高效读取复杂配置?本文将从基础语法、数据类型支持、配置读取方式、对象/集合映射等维度,深入解析两种配置文件的特性,并结合实际代码演示,助你在项目中做出最合理的技术选型!
2.正文
2.1配置文件的格式
在Spring框架中,配置文件是应用程序的重要组成部分,它允许我们将配置信息从代码中分离出来,实现配置与代码的松耦合。Spring支持多种配置文件格式,其中最常用的两种是:
.properties
文件:传统的键值对格式
.yml
或.yaml
文件:基于缩进的层次结构格式
这两种格式各有优缺点,开发者可以根据项目需求和个人偏好进行选择。接下来我们将详细探讨这两种配置格式的特点和使用方法。
2.2properties
2.2.1基础语法
Properties 文件是 Spring Boot 中最传统的配置文件格式,采用简单的 键值对(Key-Value) 形式定义配置,语法清晰但灵活性较低。以下是核心语法规则和示例:
键值对格式:
每行定义一个配置项,格式为
key=value
。
key
是配置项的唯一标识,支持.
分隔的层级命名(如db.url
)。
value
可以是字符串、数字、布尔值等,默认按字符串处理。# 示例:数据库配置 db.url=jdbc:mysql://localhost:3306/test db.username=root db.password=123456
注释:
使用
#
或!
开头添加注释,解释配置用途:# 服务器端口配置 server.port=8080 ! 开发环境开关 dev.mode=true
特殊字符处理:
若
value
包含空格、等号或冒号,需用反斜杠\
转义:error.message=参数\ 不能为空! special.symbol=key\=value
Unicode 字符支持:非 ASCII 字符(如中文)需转换为 Unicode 编码:
greeting=\u4F60\u597D(表示“你好”)
2.2.2value读取配置文件
在 Spring 中,可通过 @Value
注解或 Environment
对象直接读取配置值。
1.@Value 注解
直接在字段上使用
@Value("${key}")
注入配置值。支持设置默认值(当配置项不存在时生效):
@Component public class DatabaseConfig {@Value("${db.url:jdbc:mysql://default}") // 默认值private String url;@Value("${db.username}")private String username; }
2.Environment 对象
- 注入
Environment
对象,通过getProperty()
动态获取配置:@Autowired private Environment env;public void printConfig() {String password = env.getProperty("db.password");Integer port = env.getProperty("server.port", Integer.class); // 自动类型转换 }
3.类型转换
- 非字符串类型(如整数、布尔值)需手动转换:
@Value("${server.port}") private int port; // Spring 自动转换为 int 类型@Value("${feature.enabled:false}") // 默认值 false private boolean isEnabled;
2.2.3缺点
尽管 Properties 格式简单易用,但在复杂项目中存在明显短板:
1.层级结构缺失
所有配置项平铺展示,缺乏逻辑分组。
对比示例:
# Properties 格式 user.name=Alice user.age=25 user.address.city=Beijing
# yml 等效配置(结构更清晰) user:name: Aliceage: 25address:city: Beijing
2.重复前缀冗余
相同前缀的配置需重复书写,导致冗余:
redis.cache.host=127.0.0.1 redis.cache.port=6379 redis.cache.timeout=30
3.复杂类型支持不足
无法直接定义集合或对象,需手动拆分或借助特殊格式:
# 列表需用逗号分隔,代码中需手动解析 server.ports=8080,8081,8082# 对象需拆分为多个键值对 book.title=Spring Guide book.author=John Doe
2.3yml
2.3.1基础语法
YAL是一种以层级缩进为核心的配置文件格式,语法简洁且可读性强。以下是核心规则:
层级结构
使用 空格缩进 表示层级关系(禁止用 Tab 键)。
同一层级的元素左对齐,缩进空格数需一致。
server:port: 8080 # 正确:server 下的子层级缩进 2 空格servlet:context-path: /api # servlet 的子层级继续缩进
键值对
键与值之间用
:
分隔,冒号后必须加 一个空格。字符串默认不加引号,特殊字符(如
:
、#
)可用双引号包裹。name: Spring Boot # 普通字符串 version: "3.2.0" # 引号可省略,但推荐明确 message: "Hello:World" # 包含冒号,需用引号
注释
单行注释以
#
开头。# 服务器配置 server:port: 8080 # 开发环境端口
多行文本
用
|
保留换行符,或用>
折叠换行符。description: | # 保留换行This is amulti-linetext.summary: > # 折叠为一行(换行符转空格)This is a single-line text.
2.3.2配置不同数据类型
YML 自动识别数据类型,无需手动转换,支持以下常见类型:
字符串
path: /api/v1 # 普通字符串 error: "Error: 404\nPage not found." # 包含冒号和换行符
默认不加引号,特殊字符用双引号包裹(支持转义符如
\n
)。数值
int: 100 float: 3.14 scientific: 6.022e23 # 科学计数法
整数、浮点数直接书写,支持科学计数法。
布尔值
enabled: true debug-mode: False # 实际解析为 false
使用
true
/false
(不区分大小写)。日期
create-date: 2023-10-01 # 日期 timestamp: 2023-10-01T12:00:00+08:00 # 日期时间
遵循 ISO 8601 格式,如
yyyy-MM-dd
。null 值
description: null value: ~
用
null
或~
表示。
2.3.3配置读取
YML 配置的读取方式与 Properties 类似,但更推荐对象绑定以发挥层级优势。
@Value 注解
@Value("${server.port}") private int port;@Value("${user.name}") private String userName;
直接注入单个配置值(与 Properties 一致)。
@ConfigurationProperties 绑定对象
# YML 配置 database:url: jdbc:mysql://localhost/testusername: rootpool-size: 10
@Component @ConfigurationProperties(prefix = "database") public class DatabaseConfig {private String url;private String username;private int poolSize; // 支持驼峰命名自动匹配(pool-size → poolSize)// Getter & Setter }
将层级配置映射到 Java 对象的字段,适合复杂配置。
Environment 对象
@Autowired private Environment env;public void readConfig() {String url = env.getProperty("database.url");int poolSize = env.getProperty("database.pool-size", Integer.class); }
动态获取配置值,支持类型转换。
2.3.4配置对象和集合
YML 天然支持复杂数据结构的定义,无需拆分键名。
对象嵌套
user:name: Aliceage: 25address: # 嵌套对象city: Beijingstreet: Zhongguancun
Java 实体类绑定:
@ConfigurationProperties(prefix = "user") public class User {private String name;private int age;private Address address; // 内部类 Address 需定义 city 和 street 字段 }
通过缩进表示对象层级。
集合(List 和 Map)
# List 示例 servers:- 192.168.1.1- 192.168.1.2# Map 示例(两种写法等效) config:properties: key1: value1key2: value2# 或properties: {key1: value1, key2: value2}
Java 实体类绑定:
@ConfigurationProperties(prefix = "servers") public class ServerList {private List<String> servers; // 自动映射 List }@ConfigurationProperties(prefix = "config") public class AppConfig {private Map<String, String> properties; // 自动映射 Map }
List:用
-
表示列表项。Map:直接写键值对或使用
{}
。
2.3.5优缺点
优点:
结构清晰:层级缩进直观展示配置关系,适合复杂业务场景。
类型丰富:自动识别字符串、数值、布尔值、日期等类型。
代码简洁:通过
@ConfigurationProperties
一键绑定对象,减少冗余代码。多行文本支持:无需拼接符即可定义长文本。
缺点:
缩进敏感:缩进错误(如混用空格和 Tab)会导致解析失败。
兼容性限制:旧版本 IDE 或工具可能不支持 YAML(需安装插件)。
学习成本:对新手来说,层级规则和语法细节需时间熟悉。
2.4综合练习:验证码案例
源码:src/main/java/captcha · 爱吃烤鸡翅的酸菜鱼/springboot学习 - 码云 - 开源中国https://gitee.com/crjs-hao/springboot/tree/master/src/main/java/captcha
2.4.1分析需求
- 页面生成验证码。
- 输入验证码,点击提交,验证用户输入验证码是否正确,正确则进行页面跳转。
2.4.2接口
1. 生成验证码
请求URL:
/captcha/getCaptcha
响应:验证码图片内容
说明:浏览器向服务器发送/captcha/getCaptcha
请求,服务器返回验证码图片并在浏览器页面显示。
2. 校验验证码是否正确
请求URL:
/captcha/check
请求参数:captcha=xn8d
参数说明:captcha
为用户输入的验证码。
响应:true
或false
说明:根据用户输入的验证码校验是否正确,true
表示验证成功,false
表示验证失败。
2.4.3介绍hutool
官网:Hutool🍬一个功能丰富且易用的Java工具库
官方文档:简介 | Hutool
特点:
✅ 简单易用:方法命名直观,API 设计友好,降低学习成本。
✅ 功能全面:涵盖 Java 开发中的常见工具需求,减少依赖第三方库。
✅ 高性能:优化底层实现,避免重复造轮子。
✅ 模块化设计:可按需引入特定模块,避免项目臃肿。
maven引入依赖:
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version> <!-- 使用最新版本 -->
</dependency>
2.4.4代码实现
代码结构:
先配置好yml文件:
spring:application:name: springboot
captcha:width: 150height: 50session:key: CAPTCHA_SESSION_KEYdate: CAPTCHA_SESSION_DATE
2.4.4.1后端实现
@RequestMapping("/captcha")
@RestController
public class CaptchaController {@Autowiredprivate CaptchaPropertities captchaPropertities;private final static Long VALID_TIME = 30 * 60 * 1000L;@RequestMapping("/getCaptcha")public void getCaptcha(HttpServletResponse response, HttpSession session){response.setContentType("image/jpg");response.setCharacterEncoding("utf-8");//生成验证码try {ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(captchaPropertities.getWidth(), captchaPropertities.getHeight());String code = captcha.getCode();session.setAttribute(captchaPropertities.getSession().getKey(), code);session.setAttribute(captchaPropertities.getSession().getDate(), new Date());captcha.write(response.getOutputStream());} catch (IOException e) {e.printStackTrace();}
// }finally {
// response.getOutputStream().close();
// }}/*** 验证用户输入的验证码是否正确* @param captcha: 用户输入的验证码* @param session* @return false: 校验失败, true: 成功*/@RequestMapping("/check")public boolean check(String captcha,HttpSession session){if(!StringUtils.hasLength(captcha)){return false;}String code = (String) session.getAttribute(captchaPropertities.getSession().getKey());Date date = (Date) session.getAttribute(captchaPropertities.getSession().getDate());//验证码正确且没有过期if(captcha.equalsIgnoreCase(code) && date != null && System.currentTimeMillis() - date.getTime() < VALID_TIME){return true;}return false;}
}
1. 验证码生成流程 (
/getCaptcha
)
初始化响应
设置响应类型为图片 (
image/jpg
) 和字符编码 (utf-8
)。生成验证码
使用 Hutool 的
ShearCaptcha
工具生成指定宽高的图形验证码。获取验证码文本 (
code
) 并存入 Session,同时记录生成时间。返回验证码图片
将验证码图片写入响应输出流,供前端显示。
异常处理
捕获并打印
IOException
,确保生成失败时不影响程序运行。
2. 验证码校验流程 (
/check
)
参数检查
检查用户输入的验证码是否为空,若空则直接返回
false
。Session 验证
从 Session 中获取存储的验证码文本 (
code
) 和生成时间 (date
)。校验逻辑
验证码正确性:忽略大小写比较用户输入与 Session 中的验证码。
时效性检查:验证码需在有效期内(30 分钟内)。
返回结果
若验证码正确且未过期,返回
true
;否则返回false
。
3. 关键设计点
Session 存储:验证码文本和生成时间通过 Session 共享,确保安全性和状态管理。
时效控制:通过
VALID_TIME
(30 分钟)限制验证码有效期,增强安全性。工具库集成:利用 Hutool 的
CaptchaUtil
快速生成图形验证码,简化开发。
package captcha.model;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;@ConfigurationProperties(prefix = "captcha")
@Configuration
@Data
public class CaptchaPropertities {private Integer width;private Integer Height;private Session session;@Datapublic static class Session{private String key;private String date;}
}
1. 核心作用
这是一个基于Spring Boot的配置属性绑定类,主要功能是:
集中管理验证码相关的所有配置参数
实现配置与代码的分离,提高灵活性和可维护性
2. 关键设计
配置绑定
使用
@ConfigurationProperties
注解绑定配置文件中的属性
prefix="captcha"
表示所有配置以captcha
为前缀配置分组
主配置项:验证码图片的
width
和Height
嵌套配置:通过内部类
Session
管理session相关的配置项自动配置
@Configuration
使该类成为Spring配置类
@Data
自动生成getter/setter等方法
2.4.4.2前端核心实现
<script>$("#Img").click(function () {$(this).hide().attr('src', '/captcha/getCaptcha?dt=' + new Date().getTime()).fadeIn();});$("#checkCaptcha").click(function () {$.ajax({type: "post",url: "/captcha/check",data: {captcha: $("#inputCaptcha").val()},success: function(result){if(result){location.href = "success.html";}else {alert("验证码错误, 请重新输入");}}});});</script>
1. 验证码刷新功能
实现方式:
通过jQuery的
click
事件绑定图片点击事件点击时先隐藏图片,然后修改src属性(添加时间戳防止缓存),最后淡入显示
技术要点:
使用
new Date().getTime()
添加时间戳参数,强制浏览器重新请求图片
hide()
和fadeIn()
实现平滑的视觉过渡效果2. 验证码校验功能
实现方式:
通过AJAX POST请求发送用户输入的验证码到服务端校验
根据返回结果进行页面跳转或错误提示
技术要点:
使用jQuery的
$.ajax
方法发送异步请求成功回调中根据服务端返回的布尔值进行不同处理
location.href
实现验证成功后的页面跳转3. 整体交互流程
用户点击验证码图片 → 刷新验证码
用户输入验证码并点击校验按钮 → 发送AJAX请求
服务端返回校验结果 → 前端根据结果跳转或提示
4. 安全性考虑
时间戳参数防止浏览器缓存验证码图片
POST请求方式避免验证码出现在URL中
服务端校验结果决定后续操作
3.小结
今天的分享到这里就结束了,喜欢的小伙伴点点赞点点关注,需要所有的源代码可以去我的gitee上就可以啦~你的支持就是对我最大的鼓励,大家加油!
另外最后的最后,欢迎大家加入我的社区哦,初创社区难免经验不足,请大家多多包涵,也欢迎大家前来多多交流。
爱吃烤鸡翅的酸菜鱼社区-CSDN社区云https://bbs.csdn.net/forums/aaa1f71356f6475db42ea9ea09a392bc?spm=1001.2014.3001.6682
相关文章:

【Spring Boot】配置实战指南:Properties与YML的深度对比与最佳实践
目录 1.前言 2.正文 2.1配置文件的格式 2.2properties 2.2.1基础语法 2.2.2value读取配置文件 2.2.3缺点 2.3yml 2.3.1基础语法 2.3.2配置不同数据类型 2.3.3配置读取 2.3.4配置对象和集合 2.3.5优缺点 2.4综合练习:验证码案例 2.4.1分析需求 2.4.2…...

算法优选系列(9.BFS 解决拓扑排序)
目录 拓扑排序简介: 编辑 课程表(medium): 课程表II(medium): 火星词典(hard): 拓扑排序简介: 有向无环图(DAG图) 如上图每条边…...
(1)Java 17/18/19 新特性面试题
Java 17/18/19 新特性面试题 🚀 掌握前沿技术,成为顶尖 Java 工程师 1️⃣ Java 17/18/19 新特性价值点 👉 点击展开题目 Java 17/18/19新特性中,你认为最有价值的是哪些?请结合实际场景说明 密封类(Sealed Classes…...
LAN(局域网)和WAN(广域网)
你的问题非常清晰!我来用一个直观的比喻实际拓扑图帮你彻底理解LAN(局域网)和WAN(广域网)如何协同工作,以及路由器在其中的位置。你可以把整个网络想象成一座城市: 1. 比喻:城市交通…...

【Java高阶面经:微服务篇】7. 1秒响应保障:超时控制如何成为高并发系统的“救火队长”?
一、全链路超时建模:从用户需求到系统分解 1.1 端到端时间预算分配 黄金公式: 用户期望响应时间 = 网络传输时间 + 服务处理时间 + 下游调用时间 + 缓冲时间典型分配策略(以1秒目标为例): 环节时间预算优化目标客户端渲染100ms骨架屏(Skeleton)预渲染边缘节点(CDN)…...

力扣周赛置换环的应用,最少交换次数
置换环的基本概念 置换环是排列组合中的一个概念,用于描述数组元素的重排过程。当我们需要将一个数组转换为另一个数组时,可以把这个转换过程分解为若干个 “环”。每个环代表一组元素的循环交换路径。 举个简单例子 假设原数组 A [3, 2, 1, 4]&…...

大语言模型 12 - 从0开始训练GPT 0.25B参数量 MiniMind2 补充 训练开销 训练步骤 知识蒸馏 LoRA等
写在前面 GPT(Generative Pre-trained Transformer)是目前最广泛应用的大语言模型架构之一,其强大的自然语言理解与生成能力背后,是一个庞大而精细的训练流程。本文将从宏观到微观,系统讲解GPT的训练过程,…...
hgdbv9创建plpython3u插件后无法使用该插件创建函数
文章目录 环境症状问题原因解决方案 环境 系统平台:银河麒麟 (X86_64) 版本:9.0 症状 此问题在如下版本和安装环境出现: 安装包: hgdb-ee-9.0.1.000-build2401091440-28098d3-linux.x86_64.binOS版本&…...

SQLMesh 宏操作符详解:@IF 的条件逻辑与高级应用
SQLMesh 的 IF 宏提供了一种在 SQL 查询中嵌入条件逻辑的方法,允许根据运行时条件动态调整查询结构。本文深入探讨 IF 的语法、使用场景及实际案例,帮助开发者构建更灵活、可维护的 SQL 工作流。 1. IF 宏简介 IF 是 SQLMesh 提供的条件逻辑宏ÿ…...
nt!MiRemovePageByColor函数分析之脱链和刷新颜色表
第0部分:背景 PFN_NUMBER FASTCALL MiRemoveZeroPage ( IN ULONG Color ) { ASSERT (Color < MmSecondaryColors); Page FreePagesByColor[Color].Flink; if (Page ! MM_EMPTY_LIST) { // // Remove the first entry on the zeroe…...

【爬虫】12306自动化购票
上文: 【爬虫】12306查票-CSDN博客 下面是简单的自动化进行抢票,只写到预定票,没有写完登陆, 跳出登陆后与上述代码同理修改即可。 感觉xpath最简单,复制粘贴: 还有很多写法: 官网地址&#…...
不同消息队列保证高可用实现方案
消息队列的高可用性(High Availability, HA)是分布式系统中的核心需求,不同消息队列通过多种技术手段实现高可用。以下是主流消息队列的高可用实现方案及对比: 一、Apache Kafka 副本机制(Replication) 每个…...

【Django系统】Python+Django携程酒店评论情感分析系统
Python Django携程酒店评论情感分析系统 项目概述 这是一个基于 Django 框架开发的酒店评论情感分析系统。系统使用机器学习技术对酒店评论进行情感分析,帮助酒店管理者了解客户反馈,提升服务质量。 主要功能 评论数据导入:支持导入酒店…...

spring cloud alibaba-Geteway详解
spring cloud alibaba-Gateway详解 Gateway介绍 在 Spring Cloud Alibaba 生态系统中,Gateway 是一个非常重要的组件,用于构建微服务架构中的网关服务。它基于 Spring Cloud Gateway 进行扩展和优化,提供了更强大的功能和更好的性能。 Gat…...

c#中添加visionpro控件(联合编程)
vs添加vp控件 创建窗体应用 右键选择项 点击确定 加载CogAcqfifoTool工具拍照 设置参数保存.vpp 保存为QuickBuild或者job, ToolBlock 加载保存的acq工具 实例化相机工具类 //引入命名空间 using Cognex.VisionPro; //实例化一个相机工具类 CogAcqFifoTool cogAcqFifoTool n…...

性能测试-mysql监控
mysql常用监控指标 慢查询sql 慢查询:指执行速度低于设置的阀值的sql语句 作用:帮助定位查询速度较慢的sql语句,方便更好的优化数据库系统的性能 开启mysql慢查询日志 参数说明: slow_query_log:慢查询日志开启状态【on…...

游戏引擎学习第301天:使用精灵边界进行排序
回顾并为今天的内容做准备 昨天,我们解决了一些关于排序的问题,这对我们清理长期存在的Z轴排序问题很有帮助。这个问题我们一直想在开始常规游戏代码之前解决。虽然不确定是否完全解决了问题,但我们提出了一个看起来合理的排序标准。 有两点…...
CSS attr() 函数详解
attr() 是 CSS 中的一个函数,用于获取 HTML 元素的属性值并在样式中使用。虽然功能强大,但它的应用有一些限制和注意事项。 基本语法 element::pseudo-element {property: attr(attribute-name); } 可用场景 1. 在伪元素的 content 属性中使用&#…...

【AI生成PPT】使用ChatGPT+Overleaf自动生成学术论文PPT演示文稿
【AI生成PPT】使用ChatGPTOverleaf自动生成学术论文PPT演示文稿 文章摘要:使用ChatGPTBeamer自动生成学术论文PPT演示文稿Beamer是什么Overleaf编辑工具ChatGPT生成Beamer Latex代码论文获取prompt设计 生成结果 文章摘要: 本文介绍了一种高效利…...
流复备机断档处理
文章目录 环境症状问题原因解决方案 环境 系统平台:UOS(海光),UOS (飞腾),UOS(鲲鹏),UOS(龙芯),UOS (申威),银河麒麟svs(X86_64&…...
Linux 安装 pytorch+cuda+gpu 大模型开发环境过程记录
Linux 安装 pytorchcudagpu 大模型开发环境过程记录 2025-05-17 本文可用于生产环境,用于大模型训练开发运行。 1. 确定 OS 架构 # cat /etc/os-release NAME"Ubuntu" VERSION"20.04.6 LTS (Focal Fossa)" # uname -m x86_642. 查看磁盘空间…...

局部放大maya的视图HUD文字大小的方法
一、问题描述: 有网友问:有办法局部放大maya的字体吗比如hud中currenttime打开之后画面右下角有个frame 想放大一下能做到吗? 在 Maya 中,可以通过自定义 HUD(Heads-Up Display)元素的字体大小来局部放大特…...
数学复习笔记 16
前言 例题真是经典。 background music 《青春不一样》 2.28 算一个行列式,算出来行列式不等于零,这表示矩阵式可逆的。但是这个算的秩是复合的,感觉没啥好办法了,我直接硬算了,之后再看解析积累好的方法。算矩阵…...

初识Linux · NAT 内网穿透 内网打洞 代理
目录 前言: 内网穿透和打洞 NAPT表 内网穿透 内网打洞 正向/反向代理 前言: 本文算是网络原理的最后一点补充,为什么说是补充呢,因为我们在前面第一次介绍NAT的时候详细介绍的是报文从子网到公网,却没有介绍报文…...

STM32接收红外遥控器的遥控信号
经过几天早晨的学习,终于把遥控器的红外信号给搞通了,特此记录一下;其实说白了,红外遥控就是高低电平的信号,用时间来区分是二进制的0还是1;然后把这些0或1,在组装成一个32位的数基本就算是完事…...

Redis从入门到实战 - 高级篇(下)
一、Redis键值设计 1. 优雅的key结构 Redis的Key虽然可以自定义,但最好遵循下面几个最佳实践约定: 遵循基本格式:[业务名称]:[数据名]:[id]长度不超过44字节不包含特殊字符 例如:我们的登录业务,保存用户信息&…...
NGINX常用功能—笔记
NGINX 是一款高性能的开源 Web 服务器和反向代理服务器,常用于处理高并发场景,其功能丰富且灵活。以下是 NGINX 的常用功能及详细说明: 一、静态资源服务器 功能说明:直接处理 HTML、CSS、JavaScript、图片、视频等静态文件请求&a…...
JVM 性能问题排查实战10连击
🗂️ 目录 前言:理论掌握只是起点,定位能力才是核心全局排查模型:三步法1️⃣Full GC 频繁触发:老年代压力过大2️⃣ OOM 爆炸:元空间泄漏 or 缓存未清理3️⃣ CPU 飙升却不是 GC:线程阻塞或热方…...
【jvm第8集】jvm调优工具(图形化工具)
文章目录 一、JVM 调优图形化工具分类二、JDK 自带工具JConsoleVisualVM 三、第三方工具MAT(Memory Analyzer Tool)JProfiler(商业工具)YourKit(商业工具) 四、APM工具全链路监控与智能运维(AIO…...
Python测试单例模式
单例模式的核心思想 单例模式确保一个类只有一个实例,并提供一个全局访问点。这在需要控制资源访问(如配置文件、数据库连接等)时非常有用。 一个简单的示例: import threading import timeclass Singleton:instance Nonelock…...