【SpringBoot】整合篇
1、log4j2
-
第一步,导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions><!-- 去掉springboot默认配置 --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <!-- 引入log4j2依赖 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
如果用到
Mybatis-Plus
也需要排除默认日志依赖,不然会报错:SLF4J: Class path contains multiple SLF4J providers. SLF4J: Found provider [ch.qos.logback.classic.spi.LogbackServiceProvider@e874448] SLF4J: Found provider [org.apache.logging.slf4j.SLF4JServiceProvider@29b5cd00] SLF4J: See https://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual provider is of type [ch.qos.logback.classic.spi.LogbackServiceProvider@e874448]
-
第二步,配置文件
在项目的
resource
目录下新建文件log4j2-spring.xml
,如果自定义其他名称需在application.yml
中配置:logging:config: classpath:log4j2.xml
配置文件
log4j2-spring.xml
模版:<?xml version="1.0" encoding="UTF-8"?> <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出--> <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数--> <configuration monitorInterval="5"><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--变量配置--><Properties><!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符--><!-- %logger{36} 表示 Logger 名字最长36个字符 --><property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /><!-- 定义日志存储的路径 --><property name="FILE_PATH" value="更换为你的日志路径" /><property name="FILE_NAME" value="更换为你的项目名" /></Properties><appenders><console name="Console" target="SYSTEM_OUT"><!--输出日志的格式--><PatternLayout pattern="${LOG_PATTERN}"/><!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/></console><!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用--><File name="Filelog" fileName="${FILE_PATH}/test.log" append="false"><PatternLayout pattern="${LOG_PATTERN}"/></File><!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,默认是1 hour--><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile><!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,默认是1 hour--><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile><!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,默认是1 hour--><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile></appenders><!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。--><!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效--><loggers><!--过滤掉spring和mybatis的一些无用的DEBUG信息--><logger name="org.mybatis" level="info" additivity="false"><AppenderRef ref="Console"/></logger><!--监控系统信息--><!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。--><Logger name="org.springframework" level="info" additivity="false"><AppenderRef ref="Console"/></Logger><root level="info"><appender-ref ref="Console"/><appender-ref ref="Filelog"/><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/></root></loggers></configuration>
配置参数简介:
-
日志级别
机制:如果一条日志信息的级别大于等于配置文件的级别,就记录。
- trace:追踪,就是程序推进一下,可以写个trace输出
- debug:调试,一般作为最低级别,trace基本不用。
- info:输出重要的信息,使用较多
- warn:警告,有些信息不是错误信息,但也要给程序员一些提示。
- error:错误信息。用的也很多。
- fatal:致命错误。
-
输出源
- CONSOLE(输出到控制台)
- FILE(输出到文件)
-
格式
- SimpleLayout:以简单的形式显示
- HTMLLayout:以HTML表格显示
- PatternLayout:自定义形式显示
- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间,输出到毫秒的时间
- %-5level : 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
- %c : logger的名称(%logger)
- %t : 输出当前线程名称
- %p : 日志输出格式
- %m : 日志内容,即 logger.info(“message”)
- %n : 换行符
- %C : Java类名(%F)
- %L : 行号
- %M : 方法名
- %l : 输出语句所在的行数, 包括类名、方法名、文件名、行数
- hostName : 本地机器名
- hostAddress : 本地ip地址
log4j2配置详解:
-
根节点Configuration
属性:
- status:用来指定log4j本身的打印日志的级别.
- monitorinterval:用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.
子节点:
- Appenders
- Loggers(表明可以定义多个Appender和Logger).
-
Appenders节点:常见的有三种子节点:Console、RollingFile、File
-
Console 节点:用来定义输出到控制台的Appender。
属性:
- name:指定Appender的名字.
- target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
子节点:
- PatternLayout:输出格式,不设置默认为:%m%n.
-
File节点:用来定义输出到指定位置的文件的Appender.
属性:
- name:指定Appender的名字.
- fileName:指定输出日志的目的文件带全路径的文件名.
- PatternLayout:输出格式,不设置默认为:%m%n.
-
RollingFile节点:用来定义超过指定条件自动删除旧的创建新的Appender.
属性:
- name:指定Appender的名字.
- fileName:指定输出日志的目的文件带全路径的文件名.
- filePattern:指定当发生Rolling时,文件的转移和重命名规则.
子节点:
- PatternLayout:输出格式,不设置默认为:%m%n.
- Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
- TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am…而不是7am.
- SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
- DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。
-
Loggers节点:常见的有两种:Root和Logger.
-
Root节点:用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
属性:
- level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
子节点:
- AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.
-
Logger节点:用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
属性:
- name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
- level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
子节点:
- AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。
-
-
第三步,在代码中使用
- 直接使用
slf4j
public class Demo {private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class);public static void main(String... args) {log.error("Something else is wrong here");} }
- 搭配 Lombok
先导入 Lombok 依赖:<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.26</version> </dependency>
import lombok.extern.log4j.Log4j2;@Log4j2 public class LogTest {public static void main(String[] args) {log.info("this is info log");log.error("this is error log");log.debug("this is debug log");log.warn("this is warn log");log.trace("this is trace log");log.fatal("this is fatal log");} }
- 直接使用
2、MySQL + MybatisPlus
- 第一步,
pom.xml
导入依赖<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version> </dependency> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.9</version></dependency>
- 第二步,
application.yml
添加配置# mysql config spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf-8&autoReconnect=trueusername: rootpassword: zhangsan123# mybatis-plus config mybatis-plus:type-aliases-package: com.story.domain # 别名扫描包,指定实体类所在的包路径mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml 文件地址configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 定义MyBatis-Plus的日志实现方式(若不配置该参数,Mybatis在默认情况下会采用自动检测的方式):org.apache.ibatis.logging.slf4j.Slf4jImpl、org.apache.ibatis.logging.log4j.Log4jImpl、org.apache.ibatis.logging.stdout.StdOutImpl、org.apache.ibatis.logging.nologging.NoLoggingImplmap-underscore-to-camel-case: true # 是否开启下划线和驼峰的映射cache-enabled: false # 是否开启二级缓存global-config:banner: false # 控制MyBatis-Plus启动时是否显示banner信息db-config:id-type: assign_id # 主键生成策略:AUTO、NONE、INPUT、ASSIGN_ID、ASSIGN_UUIDupdate-strategy: not_null # 更新策略: 只更新非空字段logic-delete-value: 1 # 指定了逻辑删除的值logic-not-delete-value: 0 # 指定了未逻辑删除的值
- 第三步,代码编写(可通过 EasyCode、MybatisPlus代码生成器生成代码)
-
实体类
/*** 用户表*/ @Data @TableName("api_student") public class Student {/*** 主键 ID,使用雪花算法生成*/@TableId(type = IdType.ASSIGN_ID)private Long id;/*** 名称*/private String name;/*** 年龄*/private Integer age;/*** 性别*/private String sex;/*** 班级id*/private Integer classId; }
相关注解:@TableId、@TableName、@TableField、@TableLogic、@Version
-
数据访问层(Mapper)
package com.example.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.model.Student; import org.apache.ibatis.annotations.Mapper;@Mapper public interface StudentMapper extends BaseMapper<Student> { }
-
业务逻辑层(Service)
package com.example.demo.service;import com.baomidou.mybatisplus.extension.service.IService; import com.example.demo.model.Student;public interface StudentService extends IService<Student> { }
package com.example.demo.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.mapper.StudentMapper; import com.example.demo.model.Student; import com.example.demo.service.StudentService; import org.springframework.stereotype.Service;@Service public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService { }
-
表现层(Controller)
package com.example.demo.controller;import com.example.demo.service.StudentService; import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.*;@RestController @RequestMapping("student") public class ApiUserController {@Resourceprivate StudentService studentService;@GetMappingpublic Object query(@RequestParam Integer id) {return studentService.getById(id);}}
-
- 第四步,启动项目,通过终端访问:
curl http://127.0.0.1:8080/student?id=1
9、资料:
- springboot整合log4j2日志全解
- Spring-boot集成mybatis-plus
相关文章:
【SpringBoot】整合篇
1、log4j2 第一步,导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions><!-- 去掉springboot默认配置 --> <exclusion> <…...
写入json和读取json文件
/// <summary> ///写入文件 /// </summary> /// <param name"Stns"></param> /// <returns></returns> public ActionResult WriteJsonFile(string Stns) { strin…...
Vuex的理解及使用场景
Vuex 是 Vue.js 应用中一个专门为状态管理而设计的库,它基于 Fluts 和 Redux 的模式。Vuex 提供了一种集中式存储管理所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。以下是 Vuex 的理解及使用场景: Vuex 的理解 核心概…...
PostGis学习笔记
– 文本方式查看几何数据 SELECT ST_AsText(geom)FROM nyc_streets WHERE name ‘Avenue O’; – 计算紧邻的街区 SELECT name,ST_GeometryType(geom) FROM nyc_streets WHERE ST_DWithin( geom,ST_GeomFromText(‘LINESTRING(586782 4504202,586864 4504216)’,26918),0.1); …...
Qt 窗口类型、窗口标志和窗口属性
一、窗口类型 Qt 窗口标志枚举类型用于指定小部件的各种窗口系统属性。其中一些标志取决于底层窗口管理器是否支持它们。以下是窗口类型: Qt::QWidget:这是 QWidget 的默认类型。如果它们有父级,这种类型的部件是子部件,如果没有父控件,则为独立窗口。Qt::Window:通常具…...
相机学习笔记——工业相机的基本参数
0、相机分类 图像颜色不同可以分为黑白相机和彩色相机:相同分辨率下,黑白工业相机相比彩色工业相机精度更高,检测图像边缘时,黑白工业相机成像效果更好。 芯片类型不同可以分为CCD相机和CMOS相机:CCD工业相机具有体积小…...
MATLAB - ROS2 ros2genmsg 生成自定义消息(msg/srv...)
系列文章目录 前言 语法 ros2genmsg(folderpath)ros2genmsg(folderpath,Name=Value) 一、说明 ros2genmsg(folderpath) 通过读取指定文件夹路径下的 ROS 2 自定义信息和服务定义来生成 ROS 2 自定义信息。函数文件夹必须包含一个或多个 ROS 2 软件包。这些软件包包含 .msg 文…...

【Git 操作】-- 将 fork master 分支的最新commit更新到自己的仓库
目录 1.举例 2. 配置上游仓库(Upstream) 3. 获取上游仓库的更新 4. 切换到你自己的 master 分支 5. 合并上游仓库的 master 分支 6. 解决冲突(如果有的话) 7. 推送更新到你自己的 GitHub 仓库 1.举例 当我们从 github 的 h…...
[高等数学学习记录] 泰勒公式
1 知识点 1.1 要求 为简化计算, 通常用多项式近似表达复杂函数: 设函数 f ( x ) f(x) f(x) 在含有 x 0 x_0 x0 的开区间内具有 ( n 1 ) (n1) (n1) 阶导数, 试找出一个关于 ( x − x 0 ) (x-x_0) (x−x0) 的 n n n 次多项式 p n ( x ) p_n(x) pn(x) 近似表达 f…...

我的创作纪念日—128天的坚持|分享|成长
💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...

万字长文解读深度学习——多模态模型BLIP2
🌺历史文章列表🌺 深度学习——优化算法、激活函数、归一化、正则化 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸 深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总 万字长…...

selinux与防火墙
selinux 什么是selinux SELinux 是 Security-Enhanced Linux 的缩写,意思是安全强化的 linux 。 SELinux 主要由美国国家安全局( NSA )开发,当初开发的目的是为了避免资源的误用。 系统资源都是通过程序进行访问的࿰…...

java基础概念47-ArrayList、LinkList和迭代器
一、ArrayList集合 1-1、ArrayList的两种添加信息的方式 1-2、ArrayList集合底层逻辑 1、利用空参创建的集合,在底层创建一个默认长度为0的数组 2、添加第一个元素时,底层会创建一个新的长度为10的数组 3、存满时,会扩容1.5倍。 4、如果…...
Delphi 12.2.1 idhttpserver的使用方法
Delphi 12.2.1 idhttpserver的使用方法 1)CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);事件 该事件和IDTCPSERVER的EXECUTE()事件一样,都是“线程方法”,即事件是在子线程里…...

【golang】单元测试,以及出现undefined时的解决方案
单元测试 要对某一方法进行测试时,例如如下这一简单减法函数,选中函数名后右键->转到->测试 1)Empty test file 就是一个空文件,我们可以自己写测试的逻辑 但是直接点绿色箭头运行会出问题: 找不到包。我们要在…...

jmeter 压测常用静默参数解释应用
简介: JMeter静默压测(即无界面压测)是一种常用的性能测试方法,用于模拟多个用户同时访问系统并测量系统的响应时间和吞吐量等关键性能指标。在JMeter静默压测中,常用的压测参数及其解释如下: 一、基本…...

【开源】A059-基于SpringBoot的社区养老服务系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…...
《智能体雏形开发(高阶实操)》开发计划概述
智能体雏形开发计划 通过本计划,逐步完成一个可以真实运行的智能体雏形。 最终完成一个**“用户日志文件生成日报,日报再进一步汇总成周报”**的任务驱动型智能体雏形 第一阶段:基础准备与环境搭建 1. 学习基础知识 了解智能体的概念、类型和技术框架。学习大模型(如阿里…...
QT学习笔记-QStringList,QTimer
QStringList-存储和管理一系列的字符串 在Qt框架中,QStringList 是一个模板类 QList<QString> 的特化,专门用于处理 QString 对象(即Qt中的字符串)的列表。当你看到这样的声明: QStringList m_rec_topicList; …...

如何使用brew安装phpredis扩展?
如何使用brew安装phpredis扩展? phpredis扩展是一个用于PHP语言的Redis客户端扩展,它提供了一组PHP函数,用于与Redis服务器进行交互。 1、cd到php某一版本的bin下 /usr/local/opt/php8.1/bin 2、下载 phpredis git clone https://githu…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...