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

Spring6-单元测试:JUnit

1. 概念

在进行单元测试时,特别是针对使用了Spring框架的应用程序,我们通常需要与Spring容器交互以获取被测试对象及其依赖。传统做法是在每个测试方法中手动创建Spring容器并从中获取所需的Bean。以下面的两行常见代码为例:

ApplicationContext context = new ClassPathXmlApplicationContext("xxx.xml");
Xxxx xxx = context.getBean(Xxxx.class);

这段代码做了两件事:

  1. 创建Spring容器:使用 ClassPathXmlApplicationContext 类的构造函数创建一个Spring容器实例。这个构造函数接受一个字符串参数,即Spring配置文件(通常是XML格式)的路径。在这个例子中,配置文件名为 "xxx.xml",位于类路径(classpath)下。ClassPathXmlApplicationContext 是Spring众多容器实现之一,它能从类路径加载XML配置文件,并据此创建和管理Bean。
  2. 从容器中获取Bean:调用容器实例(context)的 getBean 方法,传入想要获取的Bean的类型或名称(这里是 Xxxx.class)。getBean 方法会查找并返回与指定类型或名称匹配的Bean实例。这样,我们就得到了需要测试的 Xxxx 类的实例。

然而,每次编写单元测试时都重复这两行代码不仅显得冗余,还增加了维护成本。尤其是在大型项目中,可能会有多个测试类需要与Spring容器交互,重复的容器创建和Bean获取逻辑会使测试代码变得复杂且不易管理。

为了解决这个问题,Spring提供了与JUnit的集成方案,允许我们在不手动创建容器的情况下,让测试框架自动处理Spring容器的创建和Bean的注入。具体而言,Spring提供了一个运行器(Runner),如 SpringJUnit4ClassRunner 或更新的 SpringExtension(对于JUnit 5),这些运行器可以配合特定的注解(如 @ContextConfiguration)来指示测试框架使用哪个配置文件(或注解配置类)来初始化Spring容器。


以下是使用Spring整合JUnit后的简化测试代码示例:

@RunWith(SpringJUnit4ClassRunner.class) // 或 @ExtendWith(SpringExtension.class) for JUnit 5
@ContextConfiguration(locations = {"classpath:xxx.xml"})
public class XxxxTest {@Autowiredprivate Xxxx xxx; // 直接注入待测试的Bean@Testpublic void testSomeMethod() {// 在这里直接使用注入的xxx对象进行测试,无需手动创建容器和获取Bean// ...}
}

通过这种方式:

  • 使用 @RunWith@ExtendWith 注解指定Spring提供的运行器,告知JUnit使用Spring的方式来运行测试。
  • 使用 @ContextConfiguration 注解指定了Spring配置文件的位置(同样可以是注解配置类),现在无需在测试代码中显式创建 ApplicationContext
  • 利用 @Autowired 注解直接在测试类的字段上声明需要注入的Bean,Spring会在容器初始化后自动将对应的Bean注入到该字段。

如此一来,可以简单理解为:

以前,每次编写单元测试时,都需要手动创建Spring容器并从中获取被测试对象。这既繁琐又容易出错。

现在,通过集成Spring与JUnit,我们可以利用Spring提供的运行器和注解来自动化容器创建和Bean注入过程。测试类只需关注具体的测试逻辑,无需关心容器管理细节,代码更加简洁、易于维护。


2. JUnit4 & JUnit5

JUnit4JUnit5 都是帮助Java程序员写单元测试的工具。简单来说:

JUnit4 是一款很老但很经典的单元测试框架。它使用注解(比如 @Test@Before@After)来标记测试方法和设置测试前后的操作。你写好测试代码,然后JUnit4帮你运行这些测试,告诉你哪些通过了,哪些失败了。它还有断言方法(如 assertEquals),让你检查程序的实际输出是否符合预期。

JUnit5 是JUnit家族的最新版本,比JUnit4更新、更强大。它继承了JUnit4的好东西(如注解),但改进了很多地方,让写测试变得更方便、更灵活:

  • 新特性:JUnit5添加了更多有用的注解(如 @BeforeEach@AfterEach@DisplayName),让测试代码更易读、更结构化。还支持参数化测试(一个测试方法跑多种输入情况),条件执行测试,以及嵌套测试(测试里面套测试)。
  • 更好兼容:JUnit5全面支持现代Java版本(如Java 8及以上),能用到Lambda表达式、Stream等新特性。它还自带一个平台,不仅能跑JUnit5的测试,还能跑JUnit4甚至其他测试框架的测试。
  • 更强大扩展:JUnit5提供了扩展机制(Extension API),让你可以更方便地定制测试行为,比如控制测试环境、模拟依赖、自定义报告等。这比JUnit4的“规则”更强大、更易于使用。

所以,如果你刚开始学习写Java单元测试,直接学JUnit5是个不错的选择,因为它是最新的、功能最全的。如果你看到一些旧代码还在用JUnit4,也不用担心,大部分基础知识是相通的,而且JUnit5也能很好地兼容运行JUnit4的测试。


3. 整合JUnit5

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.sakurapaid.spring6.bean"/>
</beans>

3.1. 搭建子模块

创建一个名为 spring-junit 的子模块,用于存放相关的测试代码和配置。


3.2. 引入依赖

在子模块的构建文件(如pom.xml或build.gradle)中添加必要的依赖项:

<dependencies><!--spring context依赖--><!--当你引入Spring Context依赖之后,表示将Spring的基础依赖引入了--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.2</version></dependency><!--spring对junit的支持相关依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>6.0.2</version></dependency><!--junit5测试--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.0</version></dependency><!--log4j2的依赖--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.19.0</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j2-impl</artifactId><version>2.19.0</version></dependency>
</dependencies>
  • Spring Context:提供Spring的核心功能,如依赖注入(DI)、AOP等,是使用Spring进行应用开发的基础。
  • Spring Test:包含了Spring对单元测试和集成测试的支持,其中包含与JUnit5集成的SpringJUnit5ClassRunner等工具。
  • JUnit Jupiter API:JUnit5的核心API包,包含编写单元测试所需的基本注解和断言。
  • Log4j2:一个流行的日志框架,以及与SLF4J(Simple Logging Facade for Java)适配的实现,用于记录和管理测试过程中的日志信息。

3.3. 添加配置文件

创建一个名为 beans.xml 的Spring配置文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 扫描指定包下的@Component、@Service、@Repository、@Controller等注解标记的类 --><context:component-scan base-package="com.sakurapaid.spring6.bean"/></beans>

此配置文件中,context:component-scan 标签用于自动扫描指定包(com.atguigu.spring6.bean)下的带有Spring组件注解(如@Component)的类,并将其注册为Spring管理的Bean。

同时,复制一个名为 log4j2.xml 的日志配置文件到项目中,用于配置Log4j2的日志记录行为。


3.4. 添加Java类

创建一个名为 User 的Java类,使用 @Component 注解标记,表示这是一个由Spring管理的Bean:

package com.sakurapaid.spring6.bean;import org.springframework.stereotype.Component;/*** User类说明* 本类用于示例Spring Bean的声明。* @Component注解:用于标记一个类作为Spring的组件,使得该组件可以被Spring的组件扫描器识别并加入到Spring的IoC容器中。*/
@Component
public class User {/*** User类的构造函数* 该构造函数在实例化User对象时会自动执行,用于执行一些初始化操作。*/public User() {System.out.println("run user");}
}

当Spring容器初始化时,会发现并创建这个带有 @Component 注解的 User 类的实例。


3.5. 测试

编写一个JUnit5测试类 SpringJUnit5Test,通过Spring与JUnit5的集成来测试 User 类:

package com.sakurapaid.spring6.test;import com.sakurapaid.spring6.bean.User;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;// 方式一:使用@ExtendWith和@ContextConfiguration注解
@ExtendWith(SpringExtension.class)
@ContextConfiguration("classpath:bean.xml")// 方式二:使用@SpringJUnitConfig注解(推荐)
//@SpringJUnitConfig(locations = "classpath:bean.xml")
public class SpringJUnit5Test {@Autowiredprivate User user;@Testpublic void testUser(){System.out.println(user);}
}

测试类中:

  • @SpringJUnitConfig@ExtendWith(SpringExtension.class) + @ContextConfiguration:这两种方式都是用来集成Spring与JUnit5的。前者是更简洁的组合注解,后者则是分别使用注解来指定Spring测试扩展和配置文件位置。它们的作用都是让Spring在测试运行前加载配置文件,创建Spring容器,并根据容器来管理测试类中的Bean。
  • @Autowired:用于自动注入 User 类的实例。由于 User 类已被Spring管理,所以在测试类中可以通过 @Autowired 注解来直接注入其实例,无需手动创建。
  • @Test:JUnit5的测试方法注解,表示该方法是一个单元测试。

测试方法 testUser() 中,打印出注入的 user 实例。当运行此测试时,Spring容器会先被创建,User 类的实例会被自动注入到测试类中,然后执行测试方法,打印出 User 实例的信息。


总结:这个示例展示了如何使用JUnit5编写单元测试,并通过Spring的配置文件和注解来管理测试所需的Bean。测试类借助Spring与JUnit5的集成,能够便捷地访问被测试对象及其依赖,从而专注于测试逻辑本身。同时,还配置了Log4j2用于记录测试过程中的日志信息。


方式一:使用 @ExtendWith@ContextConfiguration 注解

这是JUnit5早期集成Spring的一种方式,通过两个单独的注解来完成:

  1. @ExtendWith(SpringExtension.class)
    • 这是一个JUnit5的通用扩展机制注解,用于指定一个或多个测试扩展(Extension),这些扩展能够参与到测试的生命周期管理中,添加额外的功能。
    • SpringExtension 是Spring专门为JUnit5提供的扩展实现,它负责在测试运行前启动Spring容器,将Spring的依赖注入和AOP等功能与JUnit5测试框架结合起来。
    • 使用 @ExtendWith(SpringExtension.class) 注解,意味着在运行此测试类时,JUnit5会调用 SpringExtension 来处理与Spring相关的部分。
  1. @ContextConfiguration("classpath:beans.xml")
    • 这是Spring Test提供的注解,用于指定Spring容器的配置来源。在这里,它指定了一个类路径下的XML配置文件 beans.xml
    • SpringExtension 在运行测试时启动Spring容器,它会根据 @ContextConfiguration 注解提供的信息加载配置文件,创建并初始化Spring容器。
    • 有了这个配置,Spring容器就知道如何创建、装配和管理测试所需的Bean,包括那些被 @Autowired 注解的字段。

方式二:使用 @SpringJUnitConfig 注解(推荐)

@SpringJUnitConfig 是Spring Test为JUnit5专门提供的一个组合注解,它整合了上述两种方式的功能,使得集成Spring更加简洁:

  • @SpringJUnitConfig(locations = "classpath:beans.xml")
    • 这是一个单一注解,它同时包含了 @ExtendWith(SpringExtension.class)@ContextConfiguration("classpath:beans.xml") 的功能。
    • 使用 @SpringJUnitConfig,您只需要指定Spring配置文件的位置(如 "classpath:beans.xml"),而不必分别使用 @ExtendWith@ContextConfiguration
    • 这样做的好处是代码更简洁,易于阅读和理解,同时也避免了重复指定Spring扩展和配置源。

  • 方式一 是通过分别使用 @ExtendWith(SpringExtension.class)@ContextConfiguration("classpath:beans.xml") 注解来集成Spring与JUnit5。
  • 方式二 则是使用更简洁的 @SpringJUnitConfig(locations = "classpath:beans.xml") 注解,它合并了前两种注解的功能,是更推荐的集成方式。两者的目的都是启动Spring容器,加载指定的配置,以便在JUnit5测试中利用Spring的依赖注入和管理功能。对于初学者来说,直接使用 @SpringJUnitConfig 会更加直观和简便。

4. 整合JUnit4

JUnit4在公司也会经常用到,在此也学习一下

4.1. 添加依赖

<!-- junit测试 -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version>
</dependency>

4.2. 测试

编写一个JUnit4测试类 SpringJUnit4Test,通过Spring与JUnit4的集成来测试 User 类

import com.atguigu.spring6.bean.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:beans.xml")
public class SpringJUnit4Test {@Autowiredprivate User user;@Testpublic void testUser(){System.out.println(user);}
}

测试类中:

  • @RunWith(SpringJUnit4ClassRunner.class)
    • 这是一个JUnit4特有的注解,用于指定测试类的运行器(Runner)。SpringJUnit4ClassRunner 是Spring为JUnit4提供的特殊运行器,它能在运行测试之前启动Spring容器,将Spring的依赖注入等功能与JUnit4测试框架结合。
    • 使用 @RunWith(SpringJUnit4ClassRunner.class),意味着在运行此测试类时,JUnit4会使用 SpringJUnit4ClassRunner 而不是默认的 JUnit4ClassRunner,从而启用Spring容器支持。
  • @ContextConfiguration("classpath:beans.xml")
    • 这同样是Spring Test提供的注解,用于指定Spring容器的配置来源。在这里,它指定了一个类路径下的XML配置文件 beans.xml。
    • 当 SpringJUnit4ClassRunner 启动Spring容器时,它会根据 @ContextConfiguration 注解提供的信息加载配置文件,创建并初始化Spring容器。
    • 有了这个配置,Spring容器就知道如何创建、装配和管理测试所需的Bean,包括那些被 @Autowired 注解的字段。
  • @Autowired
    • 用于自动注入 User 类的实例。由于 User 类已被Spring管理,所以在测试类中可以通过 @Autowired 注解来直接注入其实例,无需手动创建。
  • @Test
    • JUnit4的测试方法注解,表示该方法是一个单元测试。

测试方法 testUser() 中,打印出注入的 user 实例。当运行此测试时,Spring容器会先被创建,User 类的实例会被自动注入到测试类中,然后执行测试方法,打印出 User 实例的信息。


总结:这个示例展示了如何使用JUnit4编写单元测试,并通过Spring的配置文件和注解来管理测试所需的Bean。测试类借助Spring与JUnit4的集成,能够便捷地访问被测试对象及其依赖,从而专注于测试逻辑本身。与JUnit5相比,JUnit4的集成方式使用了不同的注解(如 @RunWith),但基本思路是一致的:启动Spring容器,加载配置,注入依赖,然后执行测试。

相关文章:

Spring6-单元测试:JUnit

1. 概念 在进行单元测试时&#xff0c;特别是针对使用了Spring框架的应用程序&#xff0c;我们通常需要与Spring容器交互以获取被测试对象及其依赖。传统做法是在每个测试方法中手动创建Spring容器并从中获取所需的Bean。以下面的两行常见代码为例&#xff1a; ApplicationCo…...

ubuntu系统安装k8s1.28精简步骤

目录 一、规划二、环境准备2.1 配置apt仓库配置系统基本软件仓库配置k8s软件仓库安装常用软件包 2.2 修改静态ip、ntp时间同步、主机名、hosts文件、主机免密2.3 内核配置2.4 关闭防火墙、selinux、swap2.5 安装软件安装docker安装containerd安装k8s软件包 三、安装配置k8s3.1 …...

探讨Java和Go语言的缺点

文章目录 Java的缺点Go语言的缺点 通常我们都会讨论Java和GO的优点&#xff0c;如果讨论缺点往往能让人们更清楚优点的重要性&#xff0c;Java和Go的缺点或许往往就是对方优点所在 Java的缺点 冗长的代码&#xff1a;相较于一些现代编程语言&#xff0c;Java 的语法相对冗长&am…...

短剧在线搜索PHP网站源码

源码简介 短剧在线搜索PHP网站源码&#xff0c;自带本地数据库500数据&#xff0c;共有6000短剧视频&#xff0c;与短剧猫一样。 搭建环境 PHP 7.3 Mysql 5.6 安装教程 1.上传源码到网站目录中 2.修改【admin.php】中&#xff0c; $username ‘后台登录账号’; $passwor…...

Python map遍历

在Python中&#xff0c;map 函数是一个内置函数&#xff0c;它将指定的函数应用于给定序列&#xff08;如列表、元组等&#xff09;的每个项&#xff0c;并返回一个迭代器&#xff0c;该迭代器包含所有项经过指定函数处理后的结果。 ### map 函数的基本用法 map 函数的语法如…...

数据结构—红黑树

红黑树介绍 红黑树&#xff08;Red Black Tree&#xff09;是一种自平衡二叉查找树。由于其自平衡的特性&#xff0c;保证了最坏情形下在 O(logn) 时间复杂度内完成查找、增加、删除等操作&#xff0c;性能表现稳定。 在 JDK 中&#xff0c;TreeMap、TreeSet 以及 JDK1.8 的 …...

MES实施之工控机和电脑的选择

在MES项目实施过程中,经常会碰到工控机和电脑的选型问题,那么他们的区别是什么? 1、控机和普通个人电脑(PC)相比,具有以下几个区别: 1.运行环境不同:工控机通常需要在各种恶劣的工业环境中运行,如高温、高湿、强电磁干扰等,因此需要具有防尘、防水、抗干扰等特点。而…...

京东云服务器4核8G主机租用价格418元一年,1899元3年

京东云轻量云主机4核8G服务器租用价格418元一年&#xff0c;1899元3年&#xff0c;配置为&#xff1a;轻量云主机4C8G-180G SSD系统盘-5M带宽-500G月流量&#xff0c;京东云主机优惠活动 yunfuwuqiba.com/go/jd 可以查看京东云服务器详细配置和精准报价单&#xff0c;活动打开如…...

【多模态融合】MetaBEV 解决传感器故障 3D检测、BEV分割任务

前言 本文介绍多模态融合中&#xff0c;如何解决传感器故障问题&#xff1b;基于激光雷达和相机&#xff0c;融合为BEV特征&#xff0c;实现3D检测和BEV分割&#xff0c;提高系统容错性和稳定性。 会讲解论文整体思路、模型框架、论文核心点、损失函数、实验与测试效果等。 …...

[通俗易懂]《动手学强化学习》学习笔记1-第1章 初探强化学习

文章目录 前言第1章 初探强化学习1.1 简介序贯决策&#xff08;sequential decision making&#xff09;任务&#xff1a;强化学习与有监督学习或无监督学习的**区别**&#xff1a;改变未来 1.2 什么是强化学习环境交互与有监督学习的区别1&#xff1a;改变环境 &#xff08;说…...

centOS如何升级python

centOS下升级python版本的详细步骤 1、可利用linux自带下载工具wget下载&#xff0c;如下所示&#xff1a; 笔者安装的是最小centos系统&#xff0c;所以使用编译命令前&#xff0c;必须安装wget服务&#xff0c;读者如果安装的是界面centos系统&#xff0c;或者使用过编译工具…...

【MYSQL锁】透彻地理解MYSQL锁

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1.锁 1.1 概述 1.2 全局锁 1.2.1 语法 1.2.1.1 加全局锁 1.2.1.2 数据备份 1.2.1.3 释放锁 1.2.1.4 特点 1.2.1.5 演示 1.3 表级锁 1.3.1 介绍 …...

【静态分析】静态分析笔记01 - Introduction

参考&#xff1a; BV1zE411s77Z [南京大学]-[软件分析]课程学习笔记(一)-introduction_南京大学软件分析笔记-CSDN博客 ------------------------------------------------------------------------------------------------------ 1. program language and static analysis…...

使用的sql

根据CODE去重 SELECT * FROM ( SELECT count( camera_code ) AS count, camera_code FROM n_camera_basic GROUP BY camera_code ) t WHERE t.count >1 DELETE FROM n_camera_basic WHERE camera_id NOT IN (SELECT dt.minno…...

【ZZULIOJ】1052: 数列求和4(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 输入n和a&#xff0c;求aaaaaa…aa…a(n个a)&#xff0c;如当n3,a2时&#xff0c;222222的结果为246 输入 包含两个整数&#xff0c;n和a,含义如上述&#xff0c;你可以假定n和a都是小于10的非负整…...

【Linux】tcpdump P3 - 过滤和组织返回信息

文章目录 基于TCP标志的过滤器格式化 -X/-A额外的详细选项按协议(udp/tcp)过滤低详细输出 -q时间戳选项 本文继续展示帮助你过滤和组织tcpdump返回信息的功能。 基于TCP标志的过滤器 可以根据各种TCP标志来过滤TCP流量。这里是一个基于tcp-ack标志进行过滤的例子。 # tcpdump…...

vscode免费登录ssh ,linux git配置免密码

1、vscode远程ssh免密 在windows下生成密钥 , cmd窗口下执行 ssh-keygen -t rsa 在C:\Users\xxxx\.ssh目录下生成 在linux下面 cd .ssh 创建authorized_keys 文件&#xff0c; 把之前windows下生成的 id_rsa.pub内容复制进去 2、gitlab 配置。 在linux下面 ssh-keygen -t rs…...

Netty 心跳(heartbeat)——服务源码剖析(上)(四十一)

剖析目的 Netty 作为一个网络框架&#xff0c;提供了诸多功能&#xff0c;比如编码解码等&#xff0c;Netty 还提供了非常重要的一个服务----心跳机制 heartbeat.通过心跳检査对方是否有效,这是 RPC 框架中是必不可少的功能。下面我们分析一下 Netty 内部心跳服务源码实现。 源…...

C语言—每日选择题—Day65

前言 我们的刷题专栏又又又开始了&#xff0c;本专栏总结了作者做题过程中的好题和易错题。每道题都会有相应解析和配图&#xff0c;一方面可以使作者加深理解&#xff0c;一方面可以给大家提供思路&#xff0c;希望大家多多支持哦&#xff5e; 第一题 1、如下代码输出的是什么…...

【环境变量】基本概念理解 | 查看环境变量echo | PATH的应用和修改

目录 前言 基本概念&理解 注意的点 查看环境变量的方法 PATH环境变量 PTAH应用系统指令 PTAH应用用户程序 命令行参数的修改&#xff08;内存级&#xff09; 配置文件的修改 windows环境变量 大家天天开心&#x1f642; bash进程的流程。环境变量在系统指…...

5.7Python之元组

元组&#xff08;Tuple&#xff09;是Python中的一种数据类型&#xff0c;它是一个有序的、不可变的序列。元组使用圆括号 () 来表示&#xff0c;其中的元素可以是任意类型&#xff0c;并且可以包含重复的元素。 与列表&#xff08;List&#xff09;不同&#xff0c;元组是不可…...

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果 一、简单介绍 二、简单视频放大抖动效果实现原理 三、简单视频放大…...

如何通过VPN访问内网?

VPN&#xff08;Virtual Private Network&#xff09;是一种通过公共网络建立私有网络连接的技术&#xff0c;可以在不同地点的网络中建立安全通道&#xff0c;实现远程访问内网资源的目的。本文将介绍如何通过VPN访问内网&#xff0c;并介绍一款名为“天联”的VPN服务。 什么是…...

RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表

RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表 文章目录 RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表1. MQTT概览2. MQTT 5.0 特性1. 特性概要2. Docker中安装RabbitMQ及启用MQTT5.0协议 3. MQTT 5.0 功能列表1. 消息过期1. 描述2. 举例3. 实现 2. 订阅标识…...

常用脚本01 - 生成证书

1 生成证书 第一步、准备脚本文件 [rootharbor-01 ssl]# vim gencert.sh #!/usr/bin/env bash set -eDOMAIN"$1" IP"$2" WORK_DIR"$(mktemp -d)"if [ -z "$DOMAIN" ]; thenecho "Domain name needed."exit 1 fiecho "…...

【jQuery】jQuery框架

目录 1.jQuery基本用法 1.1选择器 1.2jQuery对象 1.3事件绑定 1.4链式编程 1.5过滤方法 1.6样式操纵 1.6属性操纵 1.7操作value 1.8查找方法 1.9类名操纵 1.10事件进阶 1.11触发事件 1.12window事件绑定 2.节点操作与动画 2.1获取位置 2.2滚动距离 2.3显示/隐…...

使用OMP复原一维信号(MATLAB)

参考文献 https://github.com/aresmiki/CS-Recovery-Algorithms/tree/master MATLAB代码 %% 含有噪声 % minimize ||x||_1 % subject to: (||Ax-y||_2)^2<eps; % minimize : (||Ax-y||_2)^2lambda*||x||_1 % y传输中可能含噪 yyw % %% clc;clearvars; close all; %% 1.构…...

Linux安装最新版Docker完整教程

参考官网地址&#xff1a;Install Docker Engine on CentOS | Docker Docs 一、安装前准备工作 1.1 查看服务器系统版本以及内核版本 cat /etc/redhat-release1.2 查看服务器内核版本 uname -r这里我们使用的是CentOS 7.6 系统&#xff0c;内核版本为3.10 1.3 安装依赖包 …...

iOS object-c self关键字总结

在Objective-C中&#xff0c;self 关键字是一个指向当前对象的指针。它是对象自身实例的别名&#xff0c;通常在对象内部的方法中使用&#xff0c;以提供一个指向当前对象的引用。使用 self 可以帮助你访问对象的属性和方法&#xff0c;特别是在处理消息传递和方法调用时。 以…...

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年,35M带宽

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年&#xff0c;35M带宽&#xff0c;配置为&#xff1a;16C64G-450G SSD系统盘-35M带宽-8000G月流量 华北-北京&#xff0c;京东云活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 京东云16核64G云服务器…...