当前位置: 首页 > news >正文

【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支持多种配置文件格式,其中最常用的两种是:

  1. .properties文件:传统的键值对格式

  2. .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优缺点

优点

  1. 结构清晰:层级缩进直观展示配置关系,适合复杂业务场景。

  2. 类型丰富:自动识别字符串、数值、布尔值、日期等类型。

  3. 代码简洁:通过 @ConfigurationProperties 一键绑定对象,减少冗余代码。

  4. 多行文本支持:无需拼接符即可定义长文本。

缺点

  1. 缩进敏感:缩进错误(如混用空格和 Tab)会导致解析失败。

  2. 兼容性限制:旧版本 IDE 或工具可能不支持 YAML(需安装插件)。

  3. 学习成本:对新手来说,层级规则和语法细节需时间熟悉。

2.4综合练习:验证码案例

源码:src/main/java/captcha · 爱吃烤鸡翅的酸菜鱼/springboot学习 - 码云 - 开源中国https://gitee.com/crjs-hao/springboot/tree/master/src/main/java/captcha

2.4.1分析需求

  1. 页面生成验证码。
  2. 输入验证码,点击提交,验证用户输入验证码是否正确,正确则进行页面跳转。

2.4.2接口

1. 生成验证码

请求URL/captcha/getCaptcha
响应:验证码图片内容
说明:浏览器向服务器发送/captcha/getCaptcha请求,服务器返回验证码图片并在浏览器页面显示。

2. 校验验证码是否正确

请求URL/captcha/check
请求参数captcha=xn8d
参数说明captcha为用户输入的验证码。
响应truefalse
说明:根据用户输入的验证码校验是否正确,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)

  1. 初始化响应

    • 设置响应类型为图片 (image/jpg) 和字符编码 (utf-8)。

  2. 生成验证码

    • 使用 Hutool 的 ShearCaptcha 工具生成指定宽高的图形验证码。

    • 获取验证码文本 (code) 并存入 Session,同时记录生成时间。

  3. 返回验证码图片

    • 将验证码图片写入响应输出流,供前端显示。

  4. 异常处理

    • 捕获并打印 IOException,确保生成失败时不影响程序运行。


2. 验证码校验流程 (/check)

  1. 参数检查

    • 检查用户输入的验证码是否为空,若空则直接返回 false

  2. Session 验证

    • 从 Session 中获取存储的验证码文本 (code) 和生成时间 (date)。

  3. 校验逻辑

    • 验证码正确性:忽略大小写比较用户输入与 Session 中的验证码。

    • 时效性检查:验证码需在有效期内(30 分钟内)。

  4. 返回结果

    • 若验证码正确且未过期,返回 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. 关键设计

  1. 配置绑定

    • 使用@ConfigurationProperties注解绑定配置文件中的属性

    • prefix="captcha"表示所有配置以captcha为前缀

  2. 配置分组

    • 主配置项:验证码图片的widthHeight

    • 嵌套配置:通过内部类Session管理session相关的配置项

  3. 自动配置

    • @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. 整体交互流程

  1. 用户点击验证码图片 → 刷新验证码

  2. 用户输入验证码并点击校验按钮 → 发送AJAX请求

  3. 服务端返回校验结果 → 前端根据结果跳转或提示

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综合练习&#xff1a;验证码案例 2.4.1分析需求 2.4.2…...

数据结构篇--优先级队列排序--实验报告

实验简介框架代码实验步骤运行结果实验总结 实验概述 优先队列排序算法的基本思想是&#xff1a; 将所有待排序元素依次插入到优先队列中&#xff0c;然后按照从大到小的顺序&#xff0c;通过重复删除优先队列中的最大元素&#xff0c;取出所有元素&#xff0c;从而实现排序…...

【图像大模型】基于深度对抗网络的图像超分辨率重建技术ESRGAN深度解析

基于深度对抗网络的图像超分辨率重建技术ESRGAN深度解析 一、技术背景与核心创新1.1 图像超分辨率技术演进1.2 核心技术创新对比 二、算法原理深度解析2.1 网络架构设计2.1.1 RRDB模块结构 2.2 损失函数设计2.2.1 对抗损失&#xff08;Adversarial Loss&#xff09;2.2.2 感知损…...

Ubuntu 20.04卸载并重装 PostgreSQL

在 Ubuntu 下彻底卸载并重新安装 PostgreSQL&#xff08;包括所有版本及其数据目录&#xff09;的步骤 下面是一个在 Ubuntu 下彻底卸载并重新安装 PostgreSQL&#xff08;包括所有版本及其数据目录&#xff09;的步骤。 文章目录 在 Ubuntu 下彻底卸载并重新安装 PostgreSQL&…...

debian系统redis-dump安装

1. ​Ruby 环境​ Redis-dump 是一个 Ruby 工具&#xff0c;需先安装 Ruby 和 RubyGems。 安装命令​&#xff1a; sudo apt update sudo apt install ruby-full build-essential[roota29d39f5fd10:/opt/redis-dump/bin# apt install ruby-full build-essential Reading pac…...

AI智能分析网关V4玩手机检测算法精准管控人员手机行为,搭建智慧化安防监管体系

一、背景​ 移动终端普及使随意用机成为常态&#xff0c;在生产车间、加油站、考场、手术室等场景&#xff0c;人员使用手机易引发生产事故、爆炸、作弊、仪器干扰等问题。传统人工巡查存在覆盖不足、响应慢、主观性强等局限&#xff0c;难以满足现代安全管理需求。AI智能分析…...

支持向量存储:PostgresSQL及pgvector扩展详细安装步骤!老工程接入RAG功能必备!

之前文章和大家分享过&#xff0c;将会出一篇专栏&#xff08;从电脑装ubuntu系统&#xff0c;到安装ubuntu的常用基础软件&#xff1a;jdk、python、node、nginx、maven、supervisor、minio、docker、git、mysql、redis、postgresql、mq、ollama等&#xff09;&#xff0c;目前…...

小土堆pytorch--神经网络-非线性激活线性层及其他层介绍

1. 神经网络-非线性激活 1.1 relu与sigmoid 1.1.1 ReLU&#xff08;Rectified Linear Unit&#xff0c;修正线性单元 &#xff09; 定义与数学表达&#xff1a;数学定义为 f ( x ) max ⁡ ( 0 , x ) f(x) \max(0, x) f(x)max(0,x) &#xff0c;即当输入 x > 0 x > …...

【Vue3】数据的返回和响应式处理(ref reactive)

目录 一、拉开序幕的setup 二、ref函数 2.1 访问对象的响应式处理 小结&#xff1a;ref函数 三、reactive函数 3.1 reactive同样也可以修改数组&#xff1a; 3.2 reactive小结&#xff1a; 四、Vue3中的响应式原理 4.1 vue2的响应式&#xff0c;对象属性的添加 4.2…...

【Rust智能指针】Rust智能指针原理剖析与应用指导

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

C++ - 仿 RabbitMQ 实现消息队列(3)(详解使用muduo库)

C - 仿 RabbitMQ 实现消息队列&#xff08;3&#xff09;&#xff08;详解使用muduo库&#xff09; muduo库的基层原理核心概念总结&#xff1a;通俗例子&#xff1a;餐厅模型优势体现典型场景 muduo库中的主要类EventloopMuduo 的 EventLoop 核心解析1. 核心机制&#xff1a;事…...

Java异常处理全解析:从基础到自定义

目录 &#x1f680;前言&#x1f914;异常的定义与分类&#x1f4af;运行时异常&#x1f4af;编译时异常&#x1f4af;异常的基本处理 &#x1f31f;异常的作用&#x1f427;自定义异常&#x1f4af;自定义运行时异常&#x1f4af;自定义编译时异常 ✍️异常的处理方案&#x1…...

C++初阶-vector的模拟实现2

目录 1.vector已经实现的代码总结 2.vector::resize的模拟实现 3.vector::vector(const vector& v)拷贝构造函数的模拟实现 4.vector::operator(const vector& x)的模拟实现&#xff08;原始写法&#xff09; 5.vector::swap的模拟实现 6.vector::operator(const …...

【图数据库】--Neo4j 安装

目录 1.Neo4j --概述 2.JDK安装 3.Neo4j--下载 3.1.下载资源包 3.2.创建环境变量 3.3.运行 Neo4j 是目前最流行的图形数据库(Graph Database)&#xff0c;它以节点(Node)、关系(Relationship)和属性(Property)的形式存储数据&#xff0c;专门为处理高度连接的数据而设计。…...

elementui初学1

当然可以&#xff01;下面是从零开始创建一个最简单的 Element UI 程序的完整流程&#xff0c;基于 Vue 2 Element UI&#xff08;如果你想用 Vue 3&#xff0c;请告诉我&#xff0c;我可以给你 Element Plus 的版本&#xff09;。 ✅ 一、准备环境 确保你已经安装了&#xf…...

lanqiaoOJ 4185:费马小定理求逆元

【题目来源】 https://www.lanqiao.cn/problems/4185/learning/ 【题目描述】 给出 n&#xff0c;p&#xff0c;求 。其中&#xff0c; 指存在某个整数 0≤a<p&#xff0c;使得 na mod p1&#xff0c;此时称 a 为 n 的逆元&#xff0c;即 。数据保证 p 是质数且 n mod p≠0…...

计算机视觉与深度学习 | Python实现CEEMDAN-ISOS-VMD-GRU-ARIMA时间序列预测(完整源码和数据)

以下是结合CEEMDAN、ISOS-VMD、GRU和ARIMA的时间序列预测的Python完整实现方案。本方案包含完整的代码、数据生成逻辑和实现细节说明。 完整代码实现 import numpy as np import pandas as pd from PyEMD import CEEMDAN from vmdpy import VMD from scipy.optimize import di…...

前端开发遇到 Bug,怎么办?如何利用 AI 高效解决问题

前端开发遇到 Bug&#xff0c;怎么办&#xff1f;如何利用 AI 高效解决问题 作为前端开发者&#xff0c;遇到 Bug 几乎是日常。无论是样式错乱、功能异常&#xff0c;还是接口数据不对&#xff0c;Bug 总能让人头疼。但随着人工智能&#xff08;AI&#xff09;技术的发展&…...

博主总结框架

1.博主总结框架 1.1 计算机基础类&#xff08;数据结构、计算机网络、操作系统等&#xff09; &#xff08;1&#xff09;数据结构 &#xff08;2&#xff09;操作系统 &#xff08;3&#xff09;计算机网络 &#xff08;4&#xff09;其他 物联网入门框架 1.2 计算机图形…...

国产化Excel处理组件Spire.XLS for .NET系列教程:通过 C# 将 TXT 文本转换为 Excel 表格

在数据处理和管理场景中&#xff0c;将原始文本文件&#xff08;TXT&#xff09;高效转换为结构化的 Excel 电子表格是一项常见要求。对于那些需要自动生成报表或者处理日志文件的开发人员而言&#xff0c;借助 C# 实现 TXT 到 Excel 的转换工作&#xff0c;可以简化数据组织和…...

网络安全--PHP第一天

目标 熟悉信息传递架构 基于phpstydy-mysql-php 前置条件 需要先在数据库中创建相应的库和表名并配置表的结构 该文件为数据库配置文件 名字为config.php <?php $dbip localhost;//连接数据库的地址 远程连接需要输入ip等 $dbuser root;//连接数据库的用户 $dbpass ro…...

结构型:组合模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 1、核心思想 目的&#xff1a;将总是在重复、迭代地显示的某种自相似性的结构&#xff08;部分与整体结构特征相似&#xff09;&#xff0c;例如树形结构&#xff0c;以统一的方式处…...

Node.js多版本安装工具NVM详细使用教程

一、nvm 简介 nvm&#xff08;Node Version Manager&#xff09;是一个用于管理多个 Node.js 版本的命令行工具&#xff0c;允许开发者在单个系统中轻松切换、安装和卸载不同版本的 Node.js。它是前端和后端开发中处理 Node.js 版本兼容性问题的核心工具之一。 二、nvm 安装 …...

深度解析 Java 中介者模式:重构复杂交互场景的优雅方案

一、中介者模式的核心思想与设计哲学 在软件开发的历史长河中&#xff0c;对象间的交互管理一直是架构设计的核心难题。当多个对象形成复杂的网状交互时&#xff0c;系统会陷入 "牵一发而动全身" 的困境。中介者模式&#xff08;Mediator Pattern&#xff09;作为行…...

(八)深度学习---计算机视觉基础

分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高斯混合聚类LDA主题模型 一.图像数字化表示及建模基础 二.卷积神经网络CNN基本原…...

深入剖析原型模式:原理、实现与应用实践

在软件开发的世界里,设计模式如同建筑师手中的蓝图,为复杂系统的构建提供了行之有效的解决方案。其中,原型模式(Prototype Pattern)作为创建型设计模式的重要一员,以其独特的对象创建方式,在提高代码复用性、增强系统灵活性等方面发挥着关键作用。本文将深入剖析原型模式…...

【论文阅读 | CVPR 2024 |RSDet:去除再选择:一种用于 RGB - 红外目标检测的由粗到精融合视角】

论文阅读 | CVPR 2024 |RSDet:去除再选择&#xff1a;一种用于 RGB - 红外目标检测的由粗到精融合视角 1.摘要&&引言2. 方法2.1 “由粗到细”融合策略2.2 冗余光谱去除模块&#xff08;RSR&#xff09;2.3 动态特征选择模块&#xff08;DFS&#xff09;2.4 去除与选择检…...

WinForms 应用中集成 OpenCvSharp 实现基础图像处理

引言 欢迎关注dotnet研习社&#xff0c;今天我们要讨论的主题是WinForms 应用中集成 OpenCvSharp 实现基础图像处理。 在常规的图像处理软件开发中&#xff0c;图像处理功能是这些应用程序的核心组成部分。无论是简单的照片编辑工具&#xff0c;还是复杂的计算机视觉应用&…...

apache http client连接池实现原理

在java开发中我们经常会涉及到http 请求接口&#xff0c;一般有几种方式&#xff1a; java自带的 HttpURLConnectionokHttpClientapache http client 一般我们使用apache http client会比较多点&#xff0c;在代码中会进行如下调用方式&#xff1a; private static class Htt…...

adb抓包

目录 抓包步骤 步骤 1: 获取应用的包名 步骤 2: 查看单个应用的日志 步骤 3: 使用日志级别过滤器 步骤 4: 高级日志过滤 可能的原因&#xff1a; 解决方案&#xff1a; 额外提示&#xff1a; 日志保存 抓包步骤 连接设备 adb devices 步骤 1: 获取应用的包名 首先…...

C语言---结构体 、联合体、枚举

一、初识结构体 1、结构体类型 结构体和数组都是集合&#xff0c;但是结构体有成员&#xff0c;类型可以不同&#xff1b;数组有成员&#xff0c;类型相同。 int main() {struct tag{member--list //一个或者多个成员&#xff0c;成员变量}variable--list;//可以省略&#x…...

Web Workers 使用指南

文章目录 前言基础使用高级特性 使用 ES Modules实际应用场景图像处理大数据处理轮询任务 性能优化技巧现代开发方式使用 worker-loader (Webpack) Vite中的Worker使用 限制与注意事项DOM限制:通信限制:同源策略:最佳实践 前言 Web Workers 是浏览器提供的 JavaScript 多线程解…...

JVM 与容器化部署调优实践(Docker + K8s)

&#x1f4cc; 文章目录 &#x1f4d8; 前言1️⃣ 容器环境下 JVM 面临的新挑战2️⃣ JVM 的容器资源感知机制详解3️⃣ JVM 内存调优&#xff1a;如何正确使用堆内存4️⃣ JVM CPU 调优&#xff1a;GC 与编译线程控制5️⃣ Kubernetes 典型配置误区与对策6️⃣ 实战案例&#…...

Android OkHttp控制链:深入理解网络请求的流程管理

OkHttp作为Android和Java平台上广泛使用的HTTP客户端&#xff0c;其核心设计之一就是"控制链"(Chain)机制。本文将深入探讨OkHttp控制链的工作原理、实现细节以及如何利用这一机制进行高级定制。 一、什么是OkHttp控制链 OkHttp控制链是一种责任链模式的实现&#…...

《易经》的数学表达:初级版和高级版

《易经》的数学表达&#xff0c; 一、初级版&#xff0c;可基于以下框架构建&#xff0c; 涵盖符号系统、结构代数及变换规则&#xff1a; 此框架将《易经》抽象为离散数学结构&#xff0c;兼容符号逻辑、概率论与群论&#xff0c;为算法化占断、卦象拓扑分析及跨文化比较提供…...

卷积神经网络基础(十)

之前我们学习了SGD、Momentum和AdaGrad三种优化方法&#xff0c;今天我们将继续学习Adam方法。 6.1.6 Adam 我们知道Momentum参照的是小球在碗中滚动的物理规则进行移动而实现的&#xff0c;AdaGrad为参数的每个元素适当地调整更新步伐。那如果我们将这两种方法融合在一起会不…...

怎么把cursor(Cursor/ollama)安装到指定路径

使用PowerShell命令 打开电脑开始菜单&#xff0c;输入powerShell&#xff0c;使用管理员权限打开powerShell窗口&#xff0c;使用cd命令到cursor或ollama安装包的下载目录&#xff0c;如我的Cursor所在的目录为D:\environment\cursor\soft&#xff0c;输入以下 cd E:\downloa…...

第21天-pyttsx3语音播放功能

示例1:语音参数控制(语速/音量/音调) import pyttsx3def speech_demo():engine = pyttsx3.init()# 获取当前语音参数print("默认语速:", engine.getProperty(rate))print("默认音量:", engine.getProperty(volume))print("可用语音:", engin…...

Multi-Query Attention:传统自注意力( Self-Attention)优化显存和加速方案

本文导读&#xff1a;Multi-Query Attention&#xff08;MQA&#xff09;是 Google Research 2022 年提出的一项轻量化注意力技术&#xff0c;通过“多查询、单键值”的设计&#xff0c;把自注意力层的 KV 缓存从 O(hnd) 降到 O(nd)&#xff0c;在不牺牲模型精度的前提下大幅节…...

学习路之uniapp--unipush2.0推送功能--服务端推送消息

学习路之uniapp--unipush2.0推送功能--服务端推送消息 一、二、三、 一、 二、 三、...

如何使用AI搭建WordPress网站

人工智能正迅速成为包括网页设计在内的许多行业在其功能设置中添加的一种工具。在数字设计和营销领域&#xff0c;许多成熟的工具都在其产品中添加了人工智能功能。WordPress 也是如此。作为目前最流行的网站建设工具之一&#xff0c;WordPress 的人工智能插件越来越多也就不足…...

Java 项目管理工具:Maven 与 Gradle 的深度对比与选择

Java 项目管理工具&#xff1a;Maven 与 Gradle 的深度对比与选择 在 Java 开发领域&#xff0c;项目管理工具对于项目的构建、依赖管理等起着至关重要的作用。Maven 和 Gradle 是目前最主流的两款工具&#xff0c;它们各自有着独特的优势和适用场景。本文将对 Maven 与 Gradl…...

Elasticsearch简单集成java框架方式。

Elasticsearch 在 Java 中最常用的客户端是什么&#xff1f;如何初始化一个 RestHighLevelClient&#xff1f;如何用 Spring Boot 快速集成 Elasticsearch&#xff1f;Spring Data Elasticsearch 如何定义实体类与索引的映射&#xff1f; 最常用的 Java 客户端 目前官方推荐使用…...

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Hidden Search Widget (交互式搜索框)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— Hidden Search Widget 组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ ✨ 组件目标 点击按钮展开隐藏的搜索框 再次点击按钮…...

python爬虫和逆向:百度翻译数据采集的几种方式

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、官方API方式(推荐)1.1 百度翻译开放平台API二、网页版逆向方式(代码可直接运行)2.1 拿到js加密方法2.2 python解密代码三、浏览器自动化方式3.1 Selenium自动化操作3.2 Playwright自动化四、移动端API逆向4.1 分…...

spring5-配外部文件-spEL-工厂bean-FactoryBean

spring配外部文件 我们先在Spring里配置一个数据源 1.导c3p0包,这里我们先学一下hibernate持久化框架&#xff0c;以后用mybites. <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.…...

Ubuntu部署私有Gitlab

这个东西安装其实挺简单的&#xff0c;但是因为我这边迁移了数据目录和使用自己安装的 nginx 代理还是踩了几个坑&#xff0c;所以大家可以注意下 先看下安装 # 先安装必要组件 sudo apt update sudo apt install -y curl openssh-server ca-certificates tzdata perl# 添加gi…...

Activiti 7建表语句及注释

Activiti数据库表Oracle兼容DM建表语句及字段注释。 附件下载版地址点这里 --通用属性表 create table ACT_GE_PROPERTY (NAME_ NVARCHAR2(64),VALUE_ NVARCHAR2(300),REV_ INTEGER,primary key (NAME_) );COMMENT ON TABLE ACT_GE_PROPERTY IS 通用属性表;COMMENT ON COLUMN …...

React中使用 Ant Design Charts 图表

// 引入 Ant Design Charts 的柱状图组件 Column import { Column } from ant-design/charts;// 定义函数组件 App&#xff0c;用于展示柱状图 function App() {// 数据源&#xff1a;每个对象代表一个柱子&#xff0c;包含类型&#xff08;type&#xff09;和销售额&#xff0…...

佰力博科技与您探讨压电材料的原理与压电效应的应用

压电材料的原理基于正压电效应和逆压电效应&#xff0c;即机械能与电能之间的双向转换特性。 压电材料的原理源于其独特的晶体结构和电-机械耦合效应&#xff0c;具体可分为以下核心要点&#xff1a; 1. ‌正压电效应与逆压电效应的定义‌ ‌正压电效应‌&#xff1a;当压电…...