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

Springboot3.x配置类(Configuration)和单元测试

配置类在Spring Boot框架中扮演着关键角色,它使开发者能够利用Java代码定义Bean、设定属性及调整其他Spring相关设置,取代了早期版本中依赖的XML配置文件。

  • 集中化管理:借助@Configuration注解,Spring Boot让用户能在一个或几个配置类中统一管理所有配置信息。这种方式不仅简化了Bean的定义和配置,还提高了配置管理和维护的效率,避免了分散在多个XML文件中的复杂性。
  • 类型安全配置:由于配置工作是在Java代码内完成,因此可以充分利用Java编译时的类型检查机制,确保配置的准确性。这种做法有效防止了因拼写错误或配置不当引起的运行时错误,增强了应用程序的稳定性和可靠性。
  • 条件化配置能力:该框架还提供了基于条件的配置选项,允许根据特定条件(例如环境变量、系统属性等)动态决定是否创建或配置某个Bean。这项特性增加了应用部署的灵活性,使其更易于适应不同的运行环境和需求变化。
  • 自动装配(Autowiring)支持:Spring Boot内置的自动装配功能可以根据Bean的类型、名称或是限定符自动注入所需的依赖项。这大大减少了手动配置依赖关系的工作量,同时也降低了配置出错的风险。

示例代码

首先定义一个yml的配置文件

spring:application:name: demo-springbootjackson:time-zone: Asia/Shanghaidate-format: yyyy-MM-dd HH:mm:ssdefault-property-inclusion: non_null
server:port: 8888servlet:context-path: /api
logging:level:root: errorcom.coderlk: debug
app:config:upload-addr: /opt/uploadapp-key: 12345678

解析配置文件

下面的这个Bean映射到application.yml 中的app:config:xxx的配置

package com.coderlk.interceptor.demo.config;import lombok.Data;@Data
public class AppConfigProperties {private String uploadAddr;private String appKey;
}

UploadTools.java

package com.coderlk.interceptor.demo.config;import lombok.Data;
import lombok.extern.slf4j.Slf4j;@Data
@Slf4j
public class UploadTools {private AppConfigProperties appConfigProperties;public void upload() {log.info("app.config:{}", appConfigProperties);}
}

AppConfiguration.java

package com.coderlk.interceptor.demo.config;import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class AppConfiguration {@Value("${spring.application.name}")public String appName;@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}@Bean@ConfigurationProperties(prefix = "app.config")public AppConfigProperties appConfigProperties() {return new AppConfigProperties();}@Beanpublic AppConfigProperties appConfigPropertiesNon() {return new AppConfigProperties();}@Beanpublic UploadTools uploadTools(@Qualifier("appConfigProperties") AppConfigProperties properties) {UploadTools uploadTools = new UploadTools();uploadTools.setAppConfigProperties(properties);return uploadTools;}
}

关键点解析

  • @Configuration:标记该类是一个配置类,其中的方法可以用 @Bean 注解来定义Spring容器管理的bean。
  • **@Value("...")∗∗:用于将配置文件(如‘application.yml‘或‘application.properties‘)中的值注入到字段、构造函数参数或方法参数中。这里的‘...")∗∗:用于将配置文件(如‘application.yml‘或‘application.properties‘)中的值注入到字段、构造函数参数或方法参数中。这里的‘{spring.application.name}`是Spring Boot默认提供的属性之一,代表应用的名字。
  • @Bean:用来声明一个方法,其返回的对象应该被注册为Spring容器中的一个bean。每个@Bean方法实际上就是一种创建bean的方式。
  • @ConfigurationProperties(prefix = "app.config"):允许你将一组特定前缀的配置属性映射到一个Java对象上。这简化了从配置文件读取多个相关属性的过程。在这个例子中,所有以app.config开头的属性都会映射到AppConfigProperties对象中。
  • AppConfigProperties 和 UploadTools:是我们自定义的组件类,AppConfigProperties可能用于保存应用程序的配置属性,而UploadTools则可能是负责处理上传逻辑的组件,它依赖于AppConfigProperties来进行某些操作。

测试

请求体

GET http://localhost:8888/api/uploader
Token: 213coiu423m

控制台打印结果

INFO 13428 --- [interceptor-demo] [nio-8888-exec-5] c.c.interceptor.demo.config.UploadTools  : app.config:AppConfigProperties(uploadAddr=/opt/upload, appKey=12345678)

单元测试

Spring Boot 3 与 JUnit 5 的集成使得开发者可以方便地为他们的应用程序编写和运行单元测试及集成测试。以下是有关如何在 Spring Boot 3 中使用 JUnit 5 进行测试的一些关键点:

依赖管理

  1. 确保项目中包含相关依赖
  • 默认情况下,spring-boot-starter-test 依赖项已经包含了 JUnit 5 的支持,因此你通常不需要显式添加 JUnit 5 的依赖。
  • 如果你需要特定版本的 JUnit 5 或者有其他特殊需求,则可以在 pom.xml(对于 Maven 项目)或 build.gradle(对于 Gradle 项目)中添加相应的依赖。

<dependencies><!-- Spring Boot Starter Test(包含JUnit 5支持) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

编写测试

  1. 配置JUnit 5
  • Spring Boot 3 默认启用了 JUnit 5,因此只需按照 JUnit 5 的方式编写测试代码即可。你可以直接使用 @SpringBootTest 注解来加载 Spring Boot 应用程序上下文进行集成测试。

  1. 编写测试类
  • 创建一个简单的 JUnit 5 测试类,并使用 @SpringBootTest 加载整个应用上下文。
  • 使用 @Test@BeforeEach@AfterEach 等注解定义测试方法及其生命周期行为。


import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class MyApplicationTests {@Testvoid test() {// 这里写测试逻辑}
}

JUnit 5 新特性

  1. JUnit 5 新增特性
  • 注解:提供了如 @ParameterizedTest@RepeatedTest@DisplayName 等新注解。
  • 断言:JUnit 5 提供了更加强大的内置断言库,比如 Assertions.assertThat() 和假设条件 Assumptions.assumeThat()
  • 嵌套测试:通过 @Nested 注解实现更加结构化的测试组织,允许创建内部类来进行分组测试。
  • 扩展模型:可以通过 @ExtendWith 注解引入自定义扩展,从而增强测试功能。

例如,下面是一个使用了多个新特性的测试例子:

import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.*;import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Timeout;
import org.junit.jupiter.api.extension.ExtendWith;class StandardTests {@BeforeAllstatic void initAll() { /* 初始化 */ }@BeforeEachvoid init() { /* 每个测试前执行 */ }@DisplayName("成功的测试")@Testvoid succeedingTest() { /* 测试逻辑 */ }@Testvoid failingTest() {fail("一个失败的测试");}@Test@Disabled("为了演示目的禁用")void skippedTest() { /* 不会被执行 */ }@Testvoid abortedTest() {assumeTrue("abc".contains("Z"));fail("测试应该被终止");}@AfterEachvoid tearDown() { /* 每个测试后执行 */ }@AfterAllstatic void tearDownAll() { /* 清理工作 */ }@Nested@DisplayName("当栈是新的时候")class WhenNew {Stack<Object> stack;@BeforeEachvoid createNewStack() {stack = new Stack<>();}@Test@DisplayName("是空的")void isEmpty() {assertTrue(stack.isEmpty());}@Test@DisplayName("抛出异常时弹出")void throwsExceptionWhenPopped() {assertThrows(EmptyStackException.class, stack::pop);}}
}

综上所述,在 Spring Boot 3 中使用 JUnit 5 可以让你充分利用现代 Java 测试框架的优点,同时保持与 Spring 生态系统的紧密集成。这不仅简化了测试设置过程,还提高了测试代码的质量和可读性。

断言

JUnit 5 提供了一个丰富的断言库,允许开发者编写清晰、表达力强的测试用例。相比之前的版本,JUnit 5 的断言功能更为强大和灵活,支持多种类型的断言以适应不同的测试场景。以下是一些常用的 JUnit 5 断言方法及其使用示例:

基本断言

assertEquals(expected, actual):验证两个值是否相等。

assertTrue(condition) 和 assertFalse(condition):检查条件是否为真或假。

assertNull(object) 和 assertNotNull(object):检查对象是否为 null 或不为 null。

package com.coderlk.interceptor.demo;import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;public class UnitDemoTest {@Testvoid basicAssertions() {assertEquals(2 + 2, 4, "简单的加法");assertTrue("foo".startsWith("f"), "字符串开始于 'f'");assertNull(null, "值应该是null");}
}

集合和数组断言

@Test
void collectionAssertions() {String[] expected = {"a", "b", "c"};String[] actual = {"a", "b", "c"};assertArrayEquals(expected, actual, "数组应该相等");List<String> expectedList = Arrays.asList("apple", "banana", "orange");List<String> actualList = Arrays.asList("apple", "banana", "orange");assertIterableEquals(expectedList, actualList, "列表应该相等");
}

异常处理断言

  • assertThrows(exceptionClass, executable):用于验证代码块是否抛出了预期的异常。
@Test
void exceptionAssertions() {Exception exception = assertThrows(IllegalArgumentException.class, () -> {throw new IllegalArgumentException("一个非法参数异常");});assertEquals("一个非法参数异常", exception.getMessage());
}

超时断言

  • assertTimeout(timeout, executable):确保一段代码在指定时间内完成执行。
  • assertTimeoutPreemptively(Duration timeout, Executable executable):强制性地限制一段代码的执行时间,并在超时时立即终止执行。
@Test
void timeoutAssertions() {// 如果这段代码超过1秒,测试将失败assertTimeout(Duration.ofSeconds(1), () -> {// 执行一些操作...});// 使用 preemptive 超时策略,如果超时则立即中断执行assertTimeoutPreemptively(Duration.ofMillis(100), () -> {Thread.sleep(200); // 这个应该会导致超时异常});
}

组合断言

  • assertAll(Executable... executables):可以将多个断言组合在一起,在所有断言都通过的情况下才认为整个断言成功。如果任何一个断言失败,则整个测试失败。
@Test
void multipleAssertions() {assertAll(() -> assertEquals(2, 2),() -> assertTrue("hello".startsWith("he")),() -> assertFalse("test".isEmpty()));
}

条件断言

  • assumeTrue(boolean condition) 和 assumeFalse(boolean condition):假设条件成立或不成立,如果不满足假设条件,则跳过该测试。
@Test
void conditionalAssertions() {assumeTrue("abc".contains("a"));// 如果假设条件不满足,后面的代码不会被执行System.out.println("假设条件满足");
}

这些只是 JUnit 5 断言库的一部分功能。JUnit 5 的断言机制非常强大且灵活,能够帮助开发者更有效地进行单元测试和集成测试,确保应用程序的质量和可靠性。如果你需要更加复杂的断言逻辑,还可以考虑使用第三方库如 AssertJ 或 Hamcrest,它们提供了更加丰富的断言功能。

本课程学习代码,同步更新到

https://gitcode.com/fokman/springboot-demo.gitGitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。icon-default.png?t=O83Ahttps://gitcode.com/fokman/springboot-demo.git

相关文章:

Springboot3.x配置类(Configuration)和单元测试

配置类在Spring Boot框架中扮演着关键角色&#xff0c;它使开发者能够利用Java代码定义Bean、设定属性及调整其他Spring相关设置&#xff0c;取代了早期版本中依赖的XML配置文件。 集中化管理&#xff1a;借助Configuration注解&#xff0c;Spring Boot让用户能在一个或几个配…...

Python:类方法、实例方法与静态方法深度解析(补)

目录 一.实例变量 二.类变量 三.实例方法 四.类方法 五.静态方法 六.小结 总结 今天看程序时&#xff0c;发现自己好像忘了这三者的区别&#xff0c;所以重新写了一篇深度解析&#xff0c;希望之前看博客没看懂的小伙伴可以通过这个博客分清楚这三个方法。跟的是麦叔的课…...

Certimate:简化 SSL 证书管理的开源工具

引言 SSL(Secure Sockets Layer)证书对于保护网站和用户数据至关重要。然而,管理多个 SSL 证书可能变得繁琐和复杂。为了解决这个问题,Certimate 应运而生。Certimate 是一款开源的 SSL 证书管理工具,旨在简化 SSL 证书的申请、部署和续期流程。它特别适合需要管理多个域…...

rabbitMq举例

新来个技术总监&#xff0c;把 RabbitMQ 讲的那叫一个透彻&#xff0c;佩服&#xff01; 生产者 代码举例 public String sendMsg(final String exchangeName,final String routingKey,final String msg) {} /*** 发送消息* param exchangeName exchangeName* param routin…...

人工智能增强的音频和聊天协作服务

论文标题&#xff1a;AI-enabled Audio and Chat Collaboration Services 中文标题&#xff1a;人工智能增强的音频和聊天协作服务 作者信息&#xff1a; Emil P. Andersen, Norwegian Defence Research Establishment (FFI), Kjeller, NorwayJesper R. Goksr, Sindre E. Ha…...

ctr: content digest XXX not found

1、问题描述 ctr 推送镜像到本地仓库报错 ctr: content digest sha256:b96e30ccb0a1e225493e53d4f81cb2c27183406e5f902ed43c4bf15dc6f21c9c: not found 2、问题原因 本人的平台是M1&#xff0c;正常情况下载镜像会自动按平台寻找版本&#xff0c;但是由于我下载的镜像版本没…...

java内存模型

文章目录 1.java内存模型2.重排序3.内存屏障3.1四类内存屏障指令 4.happens-before4.1 规则5.volatile5.1特性5.2规则5.3 内存语义5.4 内存屏障插入策略 1.java内存模型 java内存模型&#xff08;JMM&#xff09;定义了线程和主内存之间的抽象关系&#xff1a;线程之间的共享变…...

Java Object类与Objects类

1. Object 类 (1) Object类是Java中所有类的祖宗类&#xff0c;因此&#xff0c;Java中所有类的对象都可以直接使用Object类中提供的一些方法(public class Object)。 . (2) Object类常见方法 方法说明public String toString()返回对象的字符串形式public boolean eq…...

【目标检查】YOLO系列之:Triton 推理服务器Ultralytics YOLO11

Triton 推理服务器 1、引言2、Triton服务器2.1 什么是Triton Inference Server2.2 将YOLO11 导出为ONNX 格式2.3 设置Triton 模型库2.3.1 创建目录结构2.3.2 将导出的ONNX 模型移至Triton 资源库 2.4 运行Triton 推断服务器2.4.1 使用 Docker 运行Triton Inference Server2.4.2…...

力扣69. x 的平方根

给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1&#xff1a;…...

关于目标检测YOLO 各版本区别v1-v11/vX/vR

概述 YOLO&#xff08;You Only Look Once&#xff0c;你只看一次&#xff09;是一系列开创性的实时目标检测模型&#xff0c;它们彻底改变了计算机视觉领域。由Joseph Redmon开发&#xff0c;后续版本由不同研究人员迭代&#xff0c;YOLO模型以其在图像中检测对象的高速度和准…...

求成绩的平均值,统计低于平均分的人数

【问题描述】编写函数double average(double score[ ], int n,int *m)对存放在实型数组中考试成绩进行求平均分和低于平均分的人数&#xff0c;要求在主函数里面进行班级人数和成绩的输入&#xff0c;调用average函数进行计算成绩平均值和低于平均分的人数后&#xff0c;返回主…...

SGD、BGD、MBGD 之间的区别

文章目录 SGD&#xff08;Stochastic Gradient Descent&#xff0c;随机梯度下降&#xff09;BGD&#xff08;Batch Gradient Descent&#xff0c;批量梯度下降&#xff09;MBGD&#xff08;Mini-Batch Gradient Descent&#xff0c;小批量梯度下降&#xff09; 前置&#xff1…...

Android -- WebView之loadData加载html字符串显示网页

目录 前言1. loadUrl 加载网页地址2. loadData 加载Html字符来显示网页3. loadDataWithBaseURL4. 总结 前言 最近在给一个老项目做64位so文件的适配&#xff0c;当应用发布到应用市场上后&#xff0c;用户反馈64位手机上的网页加载不出内容&#xff0c;但32位的手机上是正常…...

单片机:实现数码管00盗99显示(附带源码)

单片机实现数码管00到99显示 在嵌入式开发中&#xff0c;数码管是最常用的显示设备之一&#xff0c;特别适合用于显示数字信息。本项目的目标是利用8051单片机控制数码管实现数字显示&#xff0c;从00到99的循环显示。我们将通过按键或定时器来控制数字的增减&#xff0c;并通…...

大厂面试智力题大全(详细解题思路,持续更新)

目录 八个球有一个比较重,问称几次可以把较重的球拎出来,具体称重的方法是怎样的? 64 匹马 8 个赛道,找出前四名,最少赛多少场(腾讯) 一个城市的加油站数量 5L的水桶和3L的水桶怎么量出4L的水 有一堆粗细不均匀的绳子,燃烧完一个绳子需要2小时,如何用这些绳子凑出…...

使用 acme.sh 签发和自动续期 ssl https 证书

acme.sh 是一个热度非常高的签发和自动续期 https 证书的工具&#xff0c;虽然官网上提供了充分的操作说明&#xff0c;但是不够简洁&#xff0c;本文以在 nginx 中签发和配置http 为例&#xff0c;列出必要的几个简单步骤。 安装 因为网络原因&#xff0c;github 大部分人是…...

YOLOv9改进,YOLOv9引入DLKA-Attention可变形大核注意力,WACV2024,二次创新RepNCSPELAN4结构

摘要 作者引入了一种称为可变形大核注意力 (D-LKA Attention) 的新方法来增强医学图像分割。这种方法使用大型卷积内核有效地捕获体积上下文,避免了过多的计算需求。D-LKA Attention 还受益于可变形卷积,以适应不同的数据模式。 理论介绍 大核卷积(Large Kernel Convolu…...

docker安装mysql8

上一篇提到了docker安装mysql5.7和mysql8有所不同&#xff0c;这一篇说一下mysql8的安装 1、宿主机创建映射目录 mkdir -p /data/mysql8/log mkdir -p /data/mysql8/data mkdir -p /data/mysql8/conf这里我放在了/data/mysql8目录下 2、拉取mysql镜像 docker pull mysql:8.…...

【云原生知识】Kubernets实践-前端服务如何访问后端服务

文章目录 概述步骤1&#xff1a;部署后端服务步骤2&#xff1a;配置Nginx步骤3&#xff1a;创建Nginx服务总结 如何确保 Nginx 能持续访问后端服务&#xff1f;相关文献 概述 假设你正在使用Kubernetes作为容器云平台&#xff0c;以下是如何配置Nginx以及相关服务&#xff0c;…...

M3DM的autodl环境构建过程笔记

文章目录 在3D-ADS环境https://blog.csdn.net/tfxzgp/article/details/144259472基础上构建(失败的记录&#xff0c;不用看)更换镜像重来&#xff08;成功&#xff09;安装缺少的包修改models.py中的RGB和点云backbone的路径修改main.py路径参数运行 在3D-ADS环境https://blog.…...

jmeter CLI Mode 传参实现动态设置用户数

一.需求 CLI 运行模式下每次运行想要传入不同的用户数&#xff0c;比如寻找瓶颈值的场景&#xff0c;需要运行多次设置不同的用户数。 二.解决思路 查看官方API Apache JMeter - Users Manual: Getting Started api CLI Mode 一节中提到可以使用如下参数做属性的替换&#…...

Mac系统下 jdk和maven 安装教程

一、jdk安装教程 1、先去官网选择对应版本下载 官网网址&#xff1a;Java SE | Oracle Technology Network | Oracle 中国 这里我选择的是jdk8的版本&#xff0c;如果你们想下载更高的版本就选择其他版本&#xff0c;目前大部分公司和教程使用jdk8的版本比较多。 点击macos&a…...

pyfink1.20版本下实现消费kafka中数据并实时计算

1、环境 JDK版本&#xff1a;1.8.0_412python版本&#xff1a;3.10.6apache-flink版本&#xff1a;1.20.0flink版本&#xff1a;1.20kafka版本&#xff1a;kafka_2.12-3.1.1flink-sql-connector-kafka版本&#xff1a;3.3.0-1.202、执行python-flink脚本 从kafka的demo获取消…...

【经验分享】私有云运维的知识点

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…...

影像组学+病理组学+深度学习人工智能应用

影像组学 基础学习内容&#xff1a; 特征提取&#xff1a;使用pyradiomics进行形状、纹理、小波变换等特征提取。特征筛选&#xff1a;应用ICC、相关系数、mRMR、Lasso等方法。建模&#xff1a;使用LR、SVM、RF、XGBoost、LightGBM等机器学习算法。模型评估&#xff1a;通过A…...

how to write 述职pptx as a tech manager

As a technical manager, crafting an effective 述职 (performance review) PPT requires you to highlight your leadership, team accomplishments, technical contributions, challenges faced, and future plans. Heres a structured approach to design your PPT: 1. Cov…...

用户发送请求后服务端i/o工作过程

华子目录 服务端i/o介绍磁盘i/o机械磁盘的寻道时间、旋转延迟和数据传输时间常见的机械磁盘平均寻道时间值常见磁盘的平均延迟时间每秒最大IOPS的计算方法 网络i/o网络I/O处理过程磁盘和网络i/o 一次完整的请求在内部的执行过程 服务端i/o介绍 i/o在计算机中指Input/Output&am…...

功能篇:springboot实现防盗链功能

防盗链&#xff08;Hotlink Protection&#xff09;是一种防止其他网站直接链接到你网站的资源&#xff08;如图片、视频等&#xff09;&#xff0c;从而节省带宽和保护内容的有效手段。在Spring Boot应用程序中实现防盗链功能&#xff0c;可以通过多种方式来达成&#xff0c;例…...

MySQL迁移SQLite

将 MySQL 的表结构和数据迁移到 SQLite&#xff0c;可以通过以下步骤实现。这个过程主要包括导出 MySQL 数据库到 SQL 文件&#xff0c;然后将其导入到 SQLite 数据库中。 步骤 1: 导出 MySQL 数据库 首先&#xff0c;需要将 MySQL 数据库导出为一个 SQL 文件。可以使用 mysq…...

嵌入式面试知识点总结 -- 面试篇

1、请你做个简单的自我介绍 把所有工作内容&#xff0c;分类整理出和岗位匹配的能力关键字&#xff0c;然后围绕关键字展开讲。每段经历要用数据来支撑。 例如&#xff1a; 面试官你好&#xff0c;我叫XXX&#xff0c;毕业于XXX&#xff0c;很荣幸参加此次面试。 围绕面试岗位…...

华为OD机试真题---观看文艺汇演问题

华为OD机试中的“观看文艺汇演问题”是一道考察算法与数据结构能力的题目。以下是对该题目的详细解析&#xff1a; 一、题目描述 为了庆祝某个重要节日&#xff08;如中国共产党成立100周年&#xff09;&#xff0c;某公园将举行多场文艺表演。很多演出都是同时进行的&#x…...

类OCSP靶场-Kioptrix系列-Kioptrix Level 2

一、前情提要 二、实战打靶 1. 信息收集 1.1. 主机发现 1.2. 端口扫描 1.3.目录遍历 2.漏洞发现 2.1. 登录框测试 2.2. 发现命令执行 2.3 构造命令执行利用payload 3.提权 3.1. 搜索提权exp 3.2. 查看exp信息 3.3. Privilege Escalation的exp利用 exp_9542 一、前…...

openlane

openlane数据集&#xff0c;lane3d_1000里训练集157807张图片&#xff0c;测试集39981张图&#xff0c;md太多了...

修改vscode设置的原理

转载请标明出处&#xff1a;小帆的帆的专栏 修改vscode设置 首先需要理解的是&#xff0c;vscode的系统设置和插件设置都是通过settings.json文件管理的。 vscode中有三个Settings&#xff0c;三个Settings分别对应三个settings.json文件 Default Settings&#xff1a;默认…...

解决docker环境下aspose-words转换word成pdf后乱码问题

描述 环境&#xff1a;docker 部署工具&#xff1a;Jenkins 需求&#xff1a;本地上传的word文档需要转换成pdf 问题&#xff1a;转换之后的pdf文档出现小框框&#xff08;乱码&#xff09; 转换成PDF的操作 pom&#xff1a; <dependency><groupId>org.apach…...

2024年12月16日Github流行趋势

项目名称&#xff1a;PDFMathTranslate 项目维护者&#xff1a;Byaidu reycn hellofinch Wybxc YadominJinta项目介绍&#xff1a;基于 AI 完整保留排版的 PDF 文档全文双语翻译&#xff0c;支持 Google/DeepL/Ollama/OpenAI 等服务&#xff0c;提供 CLI/GUI/Docker。项目star数…...

ElasticSearch 常见故障解析与修复秘籍

文章目录 一、ElasticSearch启动服务提示无法使用root用户二、ElasticSearch启动提示进程可拥有的虚拟内存少三、ElasticSearch提示用户拥有的可创建文件描述符太少四、ElasticSearch集群yellow状态分析五、ElasticSearch节点磁盘使用率过高&#xff0c;read_only状态问题解决六…...

用 Python Turtle 绘制经典汤姆猫:重温卡通角色的经典魅力

用 Python Turtle 绘制经典汤姆猫&#xff1a;重温卡通角色的经典魅力 &#x1f438; 前言 &#x1f438;&#x1f41e;往期绘画>>点击进所有绘画&#x1f41e;&#x1f40b; 效果图 &#x1f40b;&#x1f409; 代码 &#x1f409; &#x1f438; 前言 &#x1f438; 汤…...

数据结构Day4: 链表函数封装 ; 思维导图

目录 作业&#xff1a;实现链表剩下的操作&#xff1a; 任意位置删除 按位置修改 按值查找返回地址 反转 销毁 运行结果 思维导图 作业&#xff1a;实现链表剩下的操作&#xff1a; 1>任意位置删除 2>按位置修改 3>按值查找返回地址 4>反转 5>销毁 任意…...

用 Python Turtle 绘制一只可爱的小狗:用代码捕捉狗狗的萌态

用 Python Turtle 绘制一只可爱的小狗&#xff1a;用代码捕捉狗狗的萌态 &#x1f438; 前言 &#x1f438;&#x1f41e;往期绘画>>点击进所有绘画&#x1f41e;&#x1f40b; 效果图 &#x1f40b;&#x1f409; 代码 &#x1f409; &#x1f438; 前言 &#x1f438; …...

人工智能浪潮来袭:2024年技术革命与产业变革深度解析@附64页PDF文件下载

随着2024年的到来&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度、广度和深度改变着我们的生产和生活方式。在这篇深度解析中&#xff0c;我们将带您一探AI技术的最新发展、产业应用的现状以及未来的安全治理趋势。 技术革命&#xff1a;AI技术的新范…...

python 下载 b站视频 和音频

video_bvid&#xff1a; import os import requests import json import re from bs4 import BeautifulSoup import subprocess # from detail_video import video_bvid# video_bvid 是一个从外部得到的单个视频ID video_bvid BV1cx421Q7veclass BilibiliVideoAudio:def __in…...

【蓝桥杯选拔赛真题93】Scratch青蛙过河 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析

目录 Scratch青蛙过河 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 Scr…...

flink sink kafka的事务提交现象猜想

现象 查看flink源码时 sink kafka有事务提交机制&#xff0c;查看源码发现是使用两阶段提交策略&#xff0c;而事务提交是checkpoint完成后才执行&#xff0c;那么如果checkpoint设置间隔时间比较长时&#xff0c;事务未提交之前&#xff0c;后端应该消费不到数据&#xff0c…...

Oracle 临时表空间管理与最佳实践

Oracle 临时表空间管理与最佳实践 内容摘要 本文深入探讨了Oracle数据库中临时表空间的管理和最佳实践。主要内容包括&#xff1a; 临时表空间的概述及其在Oracle 19c多租户架构中的特点临时表空间组的优势及其创建方法非临时表空间组的临时表空间日常维护操作命令临时表空间…...

Java转C之继承和多态

在C/C中&#xff0c;继承和多态是面向对象编程&#xff08;OOP&#xff09;的两个重要特性。以下将详细讲解C/C中如何实现继承与多态&#xff0c;同时结合Java的对比&#xff0c;帮助理解两者的异同。 继承的实现 C/C中的继承 继承允许一个类&#xff08;派生类/子类&#xf…...

【密码学】ZUC祖冲之算法

一、ZUC算法简介 ZUC算法&#xff08;祖冲之算法&#xff09;是中国自主研发的一种流密码算法&#xff0c;2011年被3GPP批准成为4G国际标准&#xff0c;主要用于无线通信的加密和完整性保护。ZUC算法在逻辑上采用三层结构设计&#xff0c;包括线性反馈移位寄存器&#xff08;L…...

MacOS系统 快速安装appium 步骤详解

在macOS系统上&#xff0c;你可以通过使用nvm&#xff08;Node Version Manager&#xff09;来管理Node.js的版本&#xff0c;并基于nvm安装的Node.js环境来快捷地安装Appium。以下是具体步骤&#xff1a; 一、安装nvm 下载nvm 访问nvm的GitHub仓库&#xff08;nvm GitHub&…...

SEGGER | 基于STM32F405 + Keil - RTT组件07 - J-Scope数据可视化,RTT方式 + DWT定时器时间戳

导言 在上一章节SEGGER | 基于STM32F405 Keil - RTT组件06 - J-Scope数据可视化&#xff0c;使用RTT方式的第4.3章节提到&#xff0c;如果消息包不包含时间戳的话&#xff0c;那么J-Scope的横坐标的单位时间默认是100us&#xff0c;说白了时间戳是假的。会导致如下问题&#x…...