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

【SpringBoot】零基础全面解析SpringBoot配置文件

在这里插入图片描述

本篇博客给大家带来的是SpringBoot配置文件的知识点, 有properties 配置文件 和 yml 配置文件, 目前主流的是yml,所以本文以 重点讲解 yml 配置文件.
🐎文章专栏: JavaEE进阶
👉gitte链接: 薯条不要番茄酱
🚀若有问题 评论区见
欢迎大家点赞 评论 收藏 分享
如果你不知道分享给谁,那就分享给薯条.
你们的支持是我不断创作的动力 .

王子,公主请阅🚀

  • 要开心
    • 要快乐
      • 顺便进步
  • 1. 配置文件作用
  • 2. 配置文件的常规操作
  • 3. 配置文件的格式
  • 4. properties 配置文件说明
    • 4.1 properties 基本语法
    • 4.2 读取配置文件
    • 4.3 properties 缺点分析
  • 5. yml 配置文件说明
    • 5.1 yml 基本语法
    • 5.2 yml 的用法
      • 5.2.1 yml 配置不同数据类型及 null
        • 5.2.1.1 yml 配置读取
        • 5.2.1.2 注意事项:value 值加单双引号
      • 5.2.2 配置对象
      • 5.2.3 配置集合
      • 5.2.4 配置Map
    • 5.3 yml 优缺点
  • 6. 综合性练习
    • 6.1 验证码案例
      • 6.1.1 Hutool 工具包介绍
      • 6.1.2 需求
      • 6.1.3 准备工作
      • 6.1.4 约定前后端交互接口
      • 6.1.5 实现服务器端代码
      • 6.1.6 调整前端页面代码
      • 6.1.7 运行测试

要开心

要快乐

顺便进步

1. 配置文件作用


计算机上有数以千计的配置文件, 我们使用的绝大多数软件, 比如浏览器, 微信, Idea, 甚至电脑, 手机, 都离不开配置文件. 我们可能永远不会直接与其中的大部分文件打交道,但它们确实以不同的形式散落在我们的计算机上, 比如 C:\Users, C:\Windows文件夹, 以及各种 *.config, *.xml 文件

配置文件主要是为了解决硬编码带来的问题, 把可能会发生改变的信息, 放在一个集中的地方, 当我们启动某个程序时, 应用程序从配置文件中读取数据, 并加载运行.

硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中, 也就是我们常说的"代码写死".

使用配置文件, 可以使程序完成用户和应用程序的交互, 或者应用程序与其他应用程序的交互。

SpringBoot配置文件

SpringBoot 支持并定义了配置文件的格式, 也在另一个层面达到了规范其他框架集成到SpringBoot的目的.
很多项目或者框架的配置信息也放在配置文件中, 比如:
• 项目的启动端口: SpringBoot内置了Tomcat服务器, 默认端口号是8080。

• 数据库的连接信息(包含用户名和密码的设置): 对JDBC进行了更深层次的封装.让用户通过简单几行代码就可完成数据库的访问。

• 第三方系统的调用密钥等信息。

• 用于发现和定位问题的普通日志和异常日志等。

2. 配置文件的常规操作

在这里插入图片描述


修改 application.properties 文件

server.port=9090


启动程序,观察日志:

在这里插入图片描述

显示Tomcat启动端口号为9090 。

3. 配置文件的格式

Spring Boot 配置文件有以下三种:

Ⅰapplication.properties
Ⅱ application.yml
Ⅲ application.yaml


yml 为 yaml 的简写, 实际开发中出现频率最高. yaml 和yml 的使用方式一样, 文章中只介绍 yml 文件的使用。

当应用程序启动时, Spring Boot会自动从 classpath 路径找到并加载
application.properties 和 application.yaml 或者 application.yml 文件。

在这里插入图片描述

如上图所示 .properties 和 .yml 可以并存在于一个项目中 ,
当 .properties 和 .yml 并存时,两个配置都会加载. 如果配置文件内容有冲突, 则以 .properties 为主, 也就是
.properties 优先级更高. 需要注意的是虽然 .properties 可以和 .yml 共存, 但是实际开发当中, 我们通常会采取一种统一的配置文件格式, 这样方便后续的维护,降低出故障的概率。

4. properties 配置文件说明

properties 配置文件是最早期的配置文件格式,也是创建 SpringBoot 项目 默认的配置文件。

4.1 properties 基本语法


properties 是以键值的形式配置的,key 和 value 之间是以"="连接的,如:

#配置项目端口号
server.port=9090#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=handsome
spring.datasource.password=boy


想了解Spring Boot配置文件更多内容和细节: Spring Boot配置文件官网

4.2 读取配置文件


如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。
@Value 注解使用 " ${} " 的格式读取, 如下代码所示:


properties 配置如下:

server.port=9090 
mykey=aa


创建一个新的类 ReadymlController

@RequestMapping("/yml")
@RestController
public class ReadymlController {@Value("${mykey}")private String key;@RequestMapping("/readyml")public String readYml() {return "从yml中获取配置文件: "+key;}
}


运行程序, 并在浏览器访问 http://127.0.0.1:9090/yml/readyml
有如下结果说明获取成功.

在这里插入图片描述

4.3 properties 缺点分析


properties 配置文件中会有很多的冗余的信息,比如:

在这里插入图片描述

想要解决这个问题,就可以使用 yml 配置文件的格式化了.

5. yml 配置文件说明


yml 全称 Yet Another Markup Language 翻译成中文就是 “另一种标记语言”.

5.1 yml 基本语法


yml 是树形结构的配置⽂件,它的基础语法是"key: value"
key 和 value 之间使用英文冒号加空格的方式组成,空格不可省略.

在这里插入图片描述


使用 yml 连接数据库

spring:datasource:url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=falseusername: rootpassword: root


可以发现不用像 properties那样重复去写 spring 和 datasource.

5.2 yml 的用法

5.2.1 yml 配置不同数据类型及 null

# 字符串
string.value: hello# 布尔值, truefalse
boolean.value: true
boolean.value1: false# 整数
int.value: 520# 浮点数
float.value: 13.14# Null, ~代表 null
null.value: ~#  空字符串
empty.value: ''
# 直接后面什么都不加也可以,但是这种方式不直观.更多的表⽰是使⽤引号
empty.value1:
5.2.1.1 yml 配置读取


yml 读取配置的方式和 properties 相同,使用 @Value 注解即可,实现代码如下:


yml 配置:

server:port: 9090
str:value: hello


ReadymlController 文件代码:

    @Value("${mykey}")private String key;@Value("${str.value}")private String string;@RequestMapping("/readymlstr")public String readYmlstr() {return "从yml中获取配置文件: "+string;}@RequestMapping("/readyml")public String readYml() {return "从yml中获取配置文件: "+key;}


访问 http://127.0.0.1:9090/yml/readymlstr
运行结果:

在这里插入图片描述

5.2.1.2 注意事项:value 值加单双引号


字符串默认不用加上单引号或者双引号,如果加英文的单双引号可以表示特殊的含义。
在 application.yml 中配置如下信息:

string:str1: Hello \n Spring Boot.str2: 'Hello \n Spring Boot.'str3: "Hello \n Spring Boot."


ReadymlController 文件代码:

    @Value("${string.str1}")private String str1;@Value("${string.str2}")private String str2;@Value("${string.str3}")private String str3;@RequestMapping("/readyml4")public String readYml4() {System.out.println(str1);System.out.println(str2);System.out.println(str3);return "从yml中获取配置文件";}


以上程序的执行结果如下图所示:

在这里插入图片描述

从上述结果可以看出:

字符串默认不用加上单引号或者双引号.

单引号会转义特殊字符,使其失去特殊功能, 始终是一个普通的字符串.

双引号不会转义字符串里面的特殊字符, 特殊字符会表示本身的含义.

\n 本意表示的是换行, 使用单引号会转义,就是说, \n 不再表示换行了, 而是表示一个普通的字符串. 用双引号不会转义, 表示 \n 表示的是它本身的含义, 就是换行.

5.2.2 配置对象


yml 中配置对象

student:id: 1name: Javaage: 18


这个时候就不能用 @Value 来读取配置中的对象了,此时要使用另一个注解
@ConfigurationProperties 来读取,在 Student 文件中 :

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** 配置对象*/@ConfigurationProperties(prefix = "student")//从配置文件中获取默认值.
@Component//交给spring管理
@Data
public class Student {
//    id: 1
//    name: Java
//    age: 18private Integer id;private String name;private Integer age;
}


调用类的实现如下:

@RequestMapping("/yml")
@RestController
public class ReadymlController {@Autowiredprivate Student student;@RequestMapping("/readStudent")public String readStudent() {return "从yml中获取配置文件Student: "+student;}
}


运行结果如下所示:

在这里插入图片描述

5.2.3 配置集合


配置文件也可以配置 list 集合,如下所示:

dbtypes:name:- mysql- sqlserver- db2


集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取的.

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.List;/*** 配置集合*/@ConfigurationProperties("dbtypes")
@Component
@Data
public class DbType {private List<String> name;
}


访问集合的实现如下:

@RequestMapping("/yml")
@RestController
public class ReadymlController {@Autowiredprivate DbType dbType;@RequestMapping("/readDbtype")public String readDbtype() {return "从yml中获取配置文件readDbtype: "+dbType;}
}

5.2.4 配置Map


配置文件也可以配置 map

maptypes:map:k1: 1k2: 2k3: 3


Map的读取和对象一样,也是使用 @ConfigurationProperties 来读取的

import java.util.Map;@ConfigurationProperties("maptypes")
@Component
@Data
public class MapType {private Map<String,String> map;
}


打印类实现如下:

@RequestMapping("/yml")
@RestController
public class ReadymlController {@Autowiredprivate MapType mapType;@RequestMapping("/readMaptype")public String readMaptype() {return "从yml中获取配置文件readMaptype: "+mapType;}
}

5.3 yml 优缺点


优点:

1. 可读性高,写法简单, 易于理解。
2. 支持更多的数据类型, 可以简单表达对象, 数组, List,Map等数据形态.
3. 支持更多的编程语言, 不止是Java中可以使用, 在Golang, Python, Ruby, JavaScript中也可以使用。


缺点:

1. 不适合写复杂的配置文件
2. 对格式有较强的要求(一个空格可能会引起一场血案)


6. 综合性练习

6.1 验证码案例


随着安全性的要求越来越高, 目前项目中很多都使用了验证码, 验证码的形式也是多种多样, 更复杂的图形验证码和行为验证码已经成为了更流行的趋势.

验证码的实现方式很多, 网上也有比较多的插件或者工具包可以使用, 本文选择使用 Hutool工具包 来实现.

6.1.1 Hutool 工具包介绍


详细见链接: Hutool


1. 原理

验证码可以客户端生成, 也可以服务器生成. 对于普通的字符验证码, 后端通常分两部分.
一是生成验证码内容, 根据验证码内容干扰项等, 生成图片, 返回给客户端
二是把验证码内容存储起来, 校验时取出来进行对比. Hutool 把验证码存储在Session里.

2. 使用前需引入Hutool 依赖.

		<dependency><groupId>cn.hutool</groupId><artifactId>hutool-captcha</artifactId><version>5.8.16</version></dependency>

6.1.2 需求


界面如下图所示:
1. 页面生成验证码
2. 输入验证码, 点击提交, 验证用户输入验证码是否正确, 正确则进行页面跳转.

在这里插入图片描述

6.1.3 准备工作


创建项目(captcha), 引入SpringMVC的依赖包, 把前端页面放在项目中。

gitte链接: 薯条不要番茄酱

在这里插入图片描述

6.1.4 约定前后端交互接口


需求分析

后端需要提供两个服务
1. 生成验证码, 并返回验证码
2. 校验验证码是否正确.

接口定义:

1. 生成验证码

请求: captcha / get
参数: session 存储图片上的答案,方便比较.
返回值: 无.

2. 校验验证码是否正确.

请求: captcha / check
参数: inputCode, session
返回值: true 或 false.

6.1.5 实现服务器端代码


1. 引入依赖

		<dependency><groupId>cn.hutool</groupId><artifactId>hutool-captcha</artifactId><version>5.8.16</version></dependency>


2. 通过配置 yml 文件

captcha:width: 200height: 100session:key: captcha_session_keydate: captcha_session_date


3. CaptchaController 文件代码如下:

@RequestMapping("/captcha")
@RestController
public class CaptchaController {private final static long session_valid_timeout = 60 * 1000;@Autowiredprivate CaptchaProperties captchaProperties;@RequestMapping("/get")public void getCaptcha(HttpSession session, HttpServletResponse  response) {//响应中的所有数据都可以去 response中拿.LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight());//抓包发现该请求没有ContentType,但是 Spring 默认会返回 ContentType.response.setContentType("image/jpeg");//禁止缓存response.setHeader("Progma","No-cache");//图形验证码写出,可以写出到文件,也可以写出到流try {lineCaptcha.write(response.getOutputStream());String code = lineCaptcha.getCode();//拿到验证码答案.//存储sesionsession.setAttribute(captchaProperties.getSession().getKey(),code);session.setAttribute(captchaProperties.getSession().getDate(),new Date());//记录设置session时的时间response.getOutputStream().close();} catch (IOException e) {throw new RuntimeException(e);}}/*不同用户访问 /captcha/check , 拿到的session是不同的, 之前我们说过 sessionId 是唯一的.那么session是怎么拿到的呢? 先从 HttpServletRequest中拿了 cookie, 在从cookie中 拿 sessionId再根据 sessionId 拿到 session, 不同用户的 sessionId 不同, session自然不同。简单理解 就是程序本身支持多线程.*/@RequestMapping("/check")public Boolean check(String inputCode, HttpSession session) {//验证码生成的内容, 和用户输入的进行比较//session 获取信息//校验if(!StringUtils.hasLength(inputCode)) {return false;}String saveCode = (String)session.getAttribute(captchaProperties.getSession().getKey());Date saveDate = (Date) session.getAttribute(captchaProperties.getSession().getDate());if(saveCode.equalsIgnoreCase(inputCode)) {//判断验证码是否过期if(saveDate != null && System.currentTimeMillis()- saveDate.getTime() < session_valid_timeout) {return true;}}return false;}
}

6.1.6 调整前端页面代码


在 index.html中, 补充ajax代码, 点击提交按钮, 发送请求去服务端进行校验.

    $("#checkCaptcha").click(function () {$.ajax({url: "captcha/check",type: "post",data: {inputCode: $("#inputCaptcha").val()},success:function(result) {if(result==true) {location.href="success.html";}else {alert("验证码错误或者过期");}}});});

6.1.7 运行测试


通过 URL http://127.0.0.1:8080/index.html 访问服务

在这里插入图片描述

输入验证码

在这里插入图片描述



本篇博客到这里就结束啦, 感谢观看 ❤❤❤

🐎期待与你的下一次相遇😊😊😊

相关文章:

【SpringBoot】零基础全面解析SpringBoot配置文件

本篇博客给大家带来的是SpringBoot配置文件的知识点, 有properties 配置文件 和 yml 配置文件, 目前主流的是yml,所以本文以 重点讲解 yml 配置文件. &#x1f40e;文章专栏: JavaEE进阶 &#x1f449;gitte链接: 薯条不要番茄酱 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点…...

python:PyMOL 能处理 *.pdb 文件吗?

PyMOL 完全可以打开并处理 PDB&#xff08;Protein Data Bank&#xff09;文件&#xff0c;这是 PyMOL 最主要的功能之一。PDB 格式是结构生物学领域的标准文件格式&#xff0c;专门用于存储生物大分子&#xff08;如蛋白质、核酸&#xff09;的三维结构数据。 在 PyMOL 中打开…...

GNSS终端授时之四:高精度的PTP授时

我们在GNSS终端的授时之三&#xff1a;NTP网络授时中介绍了NTP网络授时的基本原理。我们知道了NTP授时的精度跟网络环境相关&#xff0c;即使在局域网中NTP授时的精度也只能到ms级别。如果广域网&#xff0c;经过多级交换机&#xff0c;路由器&#xff0c;由于传输路径和延时的…...

Vim文本编辑器快捷键用法以及简单介绍

目录 vim文本编辑器 简介&#xff1a; 语法&#xff1a; vim模式介绍&#xff1a; 模式切换&#xff1a; 用法&#xff1a; 编辑模式&#xff1a; 一般模式&#xff1a; 命令模式&#xff1a; vim文本编辑器 简介&#xff1a; 在命令行界面下&#xff0c;最常用的文本…...

CppCon 2014 学习:C++ in Huge AAA Games

“Nicolas Fleury, Technical Architect” 这份主题为 “C in Huge AAA Games” 的内容理解&#xff0c;可以从几个方面切入&#xff1a; 1. 背景 AAA大作游戏&#xff08;Triple-A Games&#xff09;指的是预算高、规模大、制作精良的顶级游戏项目。这些游戏通常代码库庞大&…...

PHP与MYSQL结合中中的一些常用函数,HTTP协议定义,PHP进行文件编程,会话技术

MYSQL&#xff1a; 查询函数: 执行查询语句: 1.mysql_query("SQL语法"); 凡是执行操作希望拿到数据库返回的数据进行展示的(结果返回: 数据结果); 2.执行结果的处理:成功为结果集&#xff0c;失败为false; 成功返回结果:SQL指令没有错误&#xff0c;但是查询结果…...

MapReduce 分布式计算模型

练习题 单词计数 需求&#xff1a;统计每个单词数量 "Hello World Hello Hadoop Hello MapReduce" 实现&#xff1a; map阶段&#xff1a;拆分成单词&#xff0c;执行map函数输出键值对<word, 1> <Hello, 1> <World, 1> <Hello, 1> <…...

Vue3 + Element Plus 防止按钮重复点击的解决方案

在 Vue3 和 Element Plus 项目中&#xff0c;防止按钮重复点击是一个常见的需求&#xff0c;特别是在表单提交、支付等场景下。以下是几种实现方式&#xff1a; 1. 使用 Element Plus 的 loading 状态 Element Plus 的按钮组件本身就支持 loading 状态&#xff0c;这是最简单…...

测试工程师学LangChain之promptTemplate 实战笔记

一、引言:大模型时代的测试自动化革命 2025 年,随着大模型(如 DeepSeek)在自动化测试领域的广泛应用,Prompt 编写已成为测试工程师的核心技能之一。 为什么? 大模型输出的质量 90% 取决于输入的 PromptLangChain 的 PromptTemplate 提供了参数化 Prompt 的标准化方案Ope…...

OpenCV计算机视觉实战(9)——阈值化技术详解

OpenCV计算机视觉实战&#xff08;9&#xff09;——阈值化技术详解 0. 前言1. 全局阈值与自适应阈值2. Otsu 算法3. 实战案例&#xff1a;文档扫描中的二值化处理4. 算法对比小结系列链接 0. 前言 在图像处理领域&#xff0c;阈值化 (Binarization) 技术就像一把魔术剪刀&…...

【Tauri2】049——upload

前言 这篇就看看一个简单地插件——upload Upload | Taurihttps://tauri.app/plugin/upload/upload的英文意思是“上传&#xff08;程序或信息&#xff09;”。 看来是用来上传文件的。 支持移动端 正文 安装 pnpm tauri add upload 在前后端都会安装&#xff0c;即 .plug…...

4、数据标注的武林秘籍:Label-Studio vs CVAT vs Roboflow

开篇痛点&#xff1a;90%的模型效果取决于数据质量 "标注3小时&#xff0c;训练5分钟"——这是很多AI工程师的真实写照。上周有位读者训练YOLOv12时发现&#xff0c;同样的代码&#xff0c;换批数据mAP直接跌了15%&#xff0c;根本原因是标注不规范&#xff01;本文…...

MATLAB项目实战:阻尼振动与数据拟合项目

关键技能点说明: 函数定义与匿名函数 使用匿名函数定义微分方程:damped_osc = @(t, Y) [...] 自定义拟合模型函数:model = @(b, t) b(1).*exp(...) 符号计算(可选) 使用符号数学工具箱求解析解:dsolve、diff、simplify 符号表达式数值化:subs + double 数值算法实现 ODE…...

74道Node.js高频题整理(附答案背诵版)

简述 Node. js 基础概念 &#xff1f; Node.js是一个基于Chrome V8引擎的JavaScript运行环境。它使得JavaScript可以在服务器端运行&#xff0c;从而进行网络编程&#xff0c;如构建Web服务器、处理网络请求等。Node.js采用事件驱动、非阻塞I/O模型&#xff0c;使其轻量且高效…...

Linux 基础IO(上)

目录 前言 重谈文件 文件操作 1.打开和关闭 2.对文件打开之后操作 理解文件fd 1.文件fd的分配规则与重定向 2.理解shell中的重定向 3.关于Linux下一切皆文件 关于缓冲区 1.为什么要有缓冲区 2.缓冲区刷新策略的问题 3.缓冲区的位置 前言 本篇到了我们linux中的文件…...

如何加载私钥为 SecKeyRef

本文介绍如何在 iOS/macOS 下将私钥加载为 SecKeyRef&#xff0c;涵盖 PEM 格式的 ECC 密钥读取、X9.63 数据构建、以及与 Keychain 的集成。 1. 使用 SecKeyCreateWithData 加载私钥 Apple 提供的 SecKeyCreateWithData 方法可以直接将密钥数据加载为 SecKeyRef 对象。 SecK…...

@Pushgateway自定义脚本推送数据

文章目录 Pushgateway 自定义脚本推送数据1. 目的2. 适用范围3. 前提条件4. 操作流程4.1 确定指标类型和格式4.2 编写推送脚本方法一:使用 curl 命令行推送方法二:使用 Python 脚本推送方法三:使用 Python 客户端库推送4.3 设置定时任务4.4 验证数据5. 高级配置5.1 使用基本…...

kubernate解决 “cni0“ already has an IP address different from 10.244.0.1/24问题

问题 NetworkPlugin cni failed to set up pod “coredns-5d4b4db-jkmnl_kube-system” network: failed to set bridge addr: “cni0” already has an IP address different from 10.244.0.1/24 解决方案 这个问题通常是由于Flannel网络插件残留配置导致的IP地址冲突。以下…...

el-tree拖拽事件,限制同级拖拽,获取拖拽后节点的前后节点,同级拖拽合并父节点name且子节点加入目标节点里

node-drag-start:开始拖拽节点时触发​​(按下鼠标按钮),无论是否允许放置,此事件都会触发。 allow-drop 返回 true 才能触发@node-drag-end="handleDragend"、@node-drop="handleDrop"; (1)allow-drop:动态控制​​是否允许放置; (2)node-dr…...

day62—DFS—太平洋大西洋水流问题(LeetCode-417)

题目描述 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights &#xff0c; hei…...

《Python基础》第2期:环境搭建

在开始编写 Python 代码前&#xff0c;还需要搭建 Python 的开发环境。 电脑是没办法直接读懂 Python 代码的&#xff0c;而是需要一个解释器&#xff0c;实时把代码翻译成字节码&#xff0c;字节码再转换成 0 和 1&#xff0c;电脑就能读懂了。 Python 的运行过程就是翻译一行…...

WSL 安装 Debian 12 后,Linux 如何安装 curl , quickjs ?

在 WSL 的 Debian 12 系统中安装 curl 非常简单&#xff0c;你可以直接使用 APT 包管理器从官方仓库安装。以下是详细步骤&#xff1a; 1. 更新软件包索引 首先确保系统的包索引是最新的&#xff1a; sudo apt update2. 安装 curl 执行以下命令安装 curl&#xff1a; sudo…...

[CSS3]vw/vh移动适配

vw/vh 目标: 能够使用vw单位设置网页元素的尺寸 相对单位相对视口的尺寸计算结果.vw全称viewport width; 1vw1/100视口宽度 vh全称viewport height; 1vh1/100视口高度 体验vw和vh单位 <!DOCTYPE html> <html lang"en"> <head><meta charset…...

Python进阶与常用库:探索高效编程的奥秘

一、文件与目录操作&#xff1a;os模块 os模块是Python标准库中用于与操作系统交互的核心工具&#xff0c;提供了丰富的文件和目录操作方法。通过os&#xff0c;开发者可以轻松实现文件路径处理、环境变量获取、目录管理等功能。 1.1 核心功能与方法 以下是os模块中常用的方…...

nt!MiDispatchFault函数分析之nt!MiCompleteProtoPteFault函数的作用

nt!MiDispatchFault函数分析之nt!MiCompleteProtoPteFault函数的作用 第一部分&#xff1a; // // PTE is still in transition state, same protection, etc. // ASSERT (Pfn1->u4.InPageError 0); if (Pfn1->u2.ShareCount 0) { MI_REMO…...

YOLOX 的动态标签分类(如 SimOTA)与 Anchor-free 机制解析2025.5.29

YOLOX 的动态标签分类&#xff08;如 SimOTA&#xff09;与 Anchor-free 机制是其核心改进中的两个关键部分&#xff0c;它们在目标检测中的作用和实现方式存在显著差异。以下从原理、实现细节及效果三个方面进行详细对比&#xff1a; 一、核心原理与目标 1. Anchor-free 机制…...

打卡day42

DAY 42 Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 1、回调函数 回调函数&#xff08;Callback Function&#xff09;是一种特殊的函数&#xff0c;它作为参数传递给另一个函数&am…...

小白的进阶之路系列之八----人工智能从初步到精通pytorch综合运用的讲解第一部分

PyTorch Tensors 通过大量实例学习编程应用是最有效的方法。 本篇是PyTorch综合运用,旨在让读者通过一行行代码亲自掌握Pytorch工具包的各种功能,有利于大家部署自己的神经网络人工智能计算工程。 首先,载入torch库。 import torch我们来看看一些基本的张量操作。首先,…...

724.寻找数组的中心下标前缀和

题目链接&#xff1a; https://leetcode.cn/problems/find-pivot-index/ 这道题目我们可以使用暴力解法&#xff0c;就一个下标前数组之和&#xff0c;再求一个下标后数组之和&#xff0c;时间复杂度达到n方&#xff0c;我们来写一下&#xff1a; int pivotIndex(vector<in…...

软考-系统架构设计师-第十六章 层次式架构设计理论与实践

层次式架构设计理论与实践 16.2 表现层框架设计16.3 中间层框架设计16.4 数据访问层设计16.5 数据架构规划与设计16.6 物联网层次架构设计 软件体系结构为软件系统提供了结构、行为和属性的高级抽象&#xff0c;由构成系统的元素描述这些元素的相互作用、指导元素集成的模式以及…...