Spring Boot应用程序接入ELK-003
Spring Boot应用程序接入ELK
一、项目依赖集成
在将Spring Boot应用程序接入ELK日志搜索引擎时,首先要在项目中集成相关依赖:
(一)Logstash依赖
<dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>5.3</version>
</dependency>
logstash - logback - encoder
依赖用于将日志格式化为适合Logstash处理的格式,方便后续日志的收集与解析。
(二)Kafka相关依赖
<dependency><groupId>com.github.danielwegener</groupId><artifactId>logback-kafka-appender</artifactId><version>0.2.0-RC1</version>
</dependency>
<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.1.12.RELEASE</version>
</dependency>
logback - kafka - appender
用于在Logback中配置Kafka相关的日志追加器,实现将日志发送到Kafka消息队列。spring - kafka
则是Spring Boot与Kafka集成的核心依赖,提供了对Kafka操作的支持 。
二、Logback配置Kafka
在logback.xml
文件中进行Kafka相关配置:
<conversionRule conversionWord="nanotime" converterClass="com.test.sunchd.log.NanoTimeConverter"/>
<define name="localIp" class="com.test.sunchd.log.LogIpProperty"/>
<appender name="KafkaAppender" class="com.github.danielwegener.logback.kafka.KafkaAppender"><encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"><providers><pattern><pattern>{"timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}","name": "%logger","level": "%level","ip": "${localIp}","service": "${applicationName}","pid": "${PID:-}","class": "%logger","method": "%method","thread": "%thread","traceId": "%X{traceId:-}","spanId": "%X{spanId:-}","parent": "%X{X - B3 - ParentSpanId:-}","message": "[%level] [${localIp}] [${applicationName}] [%thread] [%logger{36}] [%X{traceId:-}] [%X{spanId:-}] [%X{X - B3 - ParentSpanId:-}] %message"}</pattern></pattern></providers></encoder><keyingStrategy class="com.github.danielwegener.logback.kafka.keying.HostnameKeyingStrategy"/><deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy"/><producerConfig>bootstrap.servers=10.190.107.136:9092</producerConfig><topic>logs</topic><producerConfig>acks=0</producerConfig><producerConfig>linger.ms=1000</producerConfig><producerConfig>max.block.ms=0</producerConfig><producerConfig>client.id=0</producerConfig>
</appender>
<appender name="FILE-INFO-ASYNC" class="ch.qos.logback.classic.AsyncAppender"><discardingThreshold>0</discardingThreshold><queueSize>512</queueSize><appender-ref ref="FILE-INFO"/>
</appender>
<appender name="FILE-ERROR-ASYNC" class="ch.qos.logback.classic.AsyncAppender"><discardingThreshold>0</discardingThreshold><queueSize>512</queueSize><appender-ref ref="FILE-ERROR"/>
</appender>
<logger name="com.test.cop" level="DEBUG" additivity="false"><appender-ref ref="STDOUT"/><appender-ref ref="FILE-INFO-ASYNC"/><appender-ref ref="FILE-ERROR-ASYNC"/><appender-ref ref="KafkaAppender"/>
</logger>
这里配置了KafkaAppender
,使用LoggingEventCompositeJsonEncoder
对日志进行JSON格式编码,设置了日志包含的各种字段。keyingStrategy
指定按主机名进行键控,deliveryStrategy
采用异步发送策略。producerConfig
指定了Kafka的服务器地址,topic
设置为logs
。
三、关键类介绍
(一)NanoClockUtils类
package com.test.sunchd.log.utils;import java.io.Serializable;
import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
import static java.util.Objects.requireNonNull;public final class NanoClockUtils extends Clock implements Serializable {private static final long serialVersionUID = 1L;private static final long EPOCH_NANOS = System.currentTimeMillis() * 1000000L;private static final long NANO_START = System.nanoTime();private static final long OFFSET_NANOS = EPOCH_NANOS - NANO_START;private static final NanoClockUtils UTC_INSTANCE = new NanoClockUtils(ZoneOffset.UTC);private static final NanoClockUtils DEFAULT_INSTANCE = new NanoClockUtils(ZoneId.systemDefault());public static final long NANOS_PER_SECOND = 1_000_000_000L;private final ZoneId _zone;private NanoClockUtils(final ZoneId zone) {_zone = requireNonNull(zone, "zone");}@Overridepublic ZoneId getZone() {return _zone;}@Overridepublic NanoClockUtils withZone(final ZoneId zone) {return zone.equals(_zone)? this : new NanoClockUtils(zone);}@Overridepublic long millis() {return System.currentTimeMillis();}public long nanos() {return System.nanoTime() + OFFSET_NANOS;}public String nanosStr() {return String.valueOf(nanos());}@Overridepublic Instant instant() {final long now = nanos();return Instant.ofEpochSecond(now / NANOS_PER_SECOND, now % NANOS_PER_SECOND);}@Overridepublic int hashCode() {return _zone.hashCode() + 11;}@Overridepublic boolean equals(final Object obj) {return obj == this || (obj instanceof NanoClockUtils && ((NanoClockUtils) obj)._zone.equals(_zone));}@Overridepublic String toString() {return "NanoClock[" + _zone + "]";}public static NanoClockUtils system(final ZoneId zone) {return new NanoClockUtils(zone);}public static NanoClockUtils systemUTC() {return UTC_INSTANCE;}public static NanoClockUtils systemDefaultZone() {return DEFAULT_INSTANCE;}
}
该类继承自Clock
并实现Serializable
接口,用于处理纳秒级时间相关操作。定义了一些静态常量用于时间计算的偏移等,提供了获取纳秒时间、转换为Instant
等方法,还可以根据不同时区创建实例 。
(二)NanoTimeConverter类
package com.test.sunchd.log;import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import com.test.sunchd.log.utils.NanoClockUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.util.Date;public class NanoTimeConverter extends ClassicConverter {@Overridepublic String convert(ILoggingEvent event) {return NanoClockUtils.systemDefaultZone().nanosStr();}public static void main(String[] args) {String s = NanoClockUtils.systemDefaultZone().nanosStr().substring(0, 13);final long l = Long.valueOf(s);System.out.println(DateFormatUtils.format(new Date(l), "yyyyMMdd HHmmss"));}
}
该类继承自ClassicConverter
,在日志格式化时用于获取纳秒时间字符串。convert
方法获取系统默认时区下的纳秒时间字符串,main
方法用于测试时间字符串的截取和转换 。
(三)LogIpProperty类
package com.test.sunchd.log;import ch.qos.logback.core.PropertyDefinerBase;
import com.test.sunchd.log.utils.NetWorkUtil;public class LogIpProperty extends PropertyDefinerBase {private static final String ip = NetWorkUtil.getHostAddress();@Overridepublic String getPropertyValue() {return ip;}
}
该类继承自PropertyDefinerBase
,用于获取本机IP地址并在日志配置中作为属性值使用。通过调用NetWorkUtil.getHostAddress()
获取IP地址,并在getPropertyValue
方法中返回 。
(四)NetWorkUtil类
package com.test.sunchd.log.utils;import org.apache.commons.lang3.StringUtils;
import java.net.InetAddress;
import java.net.Inet4Address;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;public class NetWorkUtil {public static final String NETWORK_DOCKER = "docker";public static final String NETWORK_BRIDGE = "br";public static final String NETWORK_LINUX = "ens";public static String getHostAddress() {return getLocalHostExactAddress().getHostAddress();}public static InetAddress getLocalHostExactAddress() {try {InetAddress candidateAddress = null;Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();while (networkInterfaces.hasMoreElements()) {NetworkInterface networkInterface = networkInterfaces.nextElement();if (networkInterface.isVirtual() || networkInterface.isLoopback() || networkInterface.isPointToPoint()) {continue;}Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();while (inetAddresses.hasMoreElements()) {InetAddress inetAddress = inetAddresses.nextElement();if (inetAddress instanceof Inet4Address) {if (candidateAddress == null) {candidateAddress = inetAddress;} else {// 对每个网卡下的多个IP,再要一个个遍历,找到自己需要的for (InetAddress ipAddress : networkInterface.getInetAddresses()) {if (ipAddress.isLoopbackAddress()) {continue;}if (ipAddress.isAnyLocalAddress()) {continue;}// 如果是IPv4地址,就是它了,就是我们要找的if (ipAddress instanceof Inet4Address) {candidateAddress = ipAddress;break;}}}}}}// 如果与去loopback环境之外无其它地址了,就挑回环地址吧if (candidateAddress == null) {candidateAddress = InetAddress.getLocalHost();}return candidateAddress;} catch (Exception e) {throw new RuntimeException(e);}}public static Set<InetAddress> getLocalIpAddress() {Set<InetAddress> result = new HashSet<>();try {Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();while (networkInterfaces.hasMoreElements()) {NetworkInterface networkInterface = networkInterfaces.nextElement();Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();while (inetAddresses.hasMoreElements()) {InetAddress inetAddress = inetAddresses.nextElement();if (inetAddress instanceof Inet4Address) {result.add(inetAddress);}}}} catch (Exception e) {throw new RuntimeException(e);}return result;}public static List<InetAddress> getLocalIpAddressFromNetworkInterfaces() throws SocketException {List<InetAddress> addresses = new ArrayList<>();Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();if (networkInterfaces == null) {return addresses;}while (networkInterfaces.hasMoreElements()) {NetworkInterface networkInterface = networkInterfaces.nextElement();Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();while (inetAddresses.hasMoreElements()) {InetAddress inetAddress = inetAddresses.nextElement();if (inetAddress instanceof Inet4Address) {addresses.add(inetAddress);}}}return addresses;}public static boolean isBridgeNetwork(NetworkInterface ni) {if (ni == null) {return false;}return StringUtils.startsWithIgnoreCase(ni.getName(), NETWORK_BRIDGE);}public static boolean isDockerNetwork(NetworkInterface ni) {if (ni == null) {return false;}return StringUtils.startsWithIgnoreCase(ni.getName(), NETWORK_DOCKER);}
}
该类提供了一系列网络相关工具方法。定义了一些网络类型的标识常量,如docker
、br
、ens
。getHostAddress
和getLocalHostExactAddress
方法用于获取本机精确的IP地址,会遍历网络接口排除虚拟、环回等地址。getLocalIpAddress
和getLocalIpAddressFromNetworkInterfaces
用于获取本机所有IPv4地址,isBridgeNetwork
和isDockerNetwork
用于判断网络接口是否属于特定网络类型 。
四、后续流程
在完成上述配置后,Kafka的主题设置为logs
,logstash
作为消费者从kafka
的logs
主题获取日志数据,并将其推送至elasticsearch(es)
。最终,我们可以在kibana
中根据配置的索引模式查询和分析这些日志,实现对Spring Boot应用程序日志的高效管理与分析。
相关文章:
Spring Boot应用程序接入ELK-003
Spring Boot应用程序接入ELK 一、项目依赖集成 在将Spring Boot应用程序接入ELK日志搜索引擎时,首先要在项目中集成相关依赖: (一)Logstash依赖 <dependency><groupId>net.logstash.logback</groupId><a…...
spark(一)
本节课围绕Spark Core展开深入学习,了解了Spark的运行架构、核心组件、核心概念以及提交流程,明晰其整体运行机制与各部分协作逻辑。重点聚焦于两个核心组件;对RDD相关概念进行了细致学习,包括其核心属性、执行原理、序列化方式、…...
绿电直供零碳园区:如何用清洁能源重塑企业竞争力?
引言 在全球积极应对气候变化的大背景下,“双碳” 目标已成为世界各国实现可持续发展的关键战略方向。我国也明确提出要在 2030 年前实现碳达峰,2060 年前实现碳中和,这一宏伟目标的提出,对各行各业都产生了深远影响,…...
国家科技奖项目答辩ppt设计_科技进步奖PPT制作_技术发明奖ppt美化_自然科学奖ppt模板
国家科学技术奖 为了奖励在科学技术进步活动中做出突出贡献的公民、组织,调动科学技术工作者的积极性和创造性,加速科学技术事业的发展,提高综合国力而设立的一系列奖项。每两三年评选一次。 科技奖ppt案例 WordinPPT / 持续为双一流高校、…...
LLM应用实战2-理解Tokens
文章目录 基本定义Tokenization 的作用主流 Tokenization 算法示例示例GPT-4o&GPT-4o miniGPT-3.5 & GPT-4 基本定义 Tokens 是大型语言模型(LLM)处理文本或代码的最小语义单元,可包含以下形式: 字符(如英文…...
【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化详解 - 3-5年Java开发必备知识
【Java面试系列】Spring Boot微服务架构下的分布式事务处理与性能优化详解 - 3-5年Java开发必备知识 引言 在当今的微服务架构中,分布式事务处理和性能优化是面试中经常被问及的高频话题。随着系统规模的扩大,如何保证数据一致性和系统性能成为了开发者…...
NO.80十六届蓝桥杯备战|数据结构-字符串哈希|兔子与兔子(C++)
回忆:哈希函数与哈希冲突 哈希函数:将关键字映射成对应的地址的函数,记为 Hash(key) Addr 。哈希冲突:哈希函数可能会把两个或两个以上的不同关键字映射到同⼀地址,这种情况称为哈希冲突。 字符串哈希 定义⼀个把字…...
Spring MVC 请求类型注解详解
Spring MVC 请求类型注解详解 1. 核心注解分类 Spring MVC 中的请求处理注解分为以下几类: 类别注解示例作用范围方法级注解RequestMapping, GetMapping 等方法级别参数级注解RequestParam, RequestBody方法参数模型/会话注解ModelAttribute, SessionAttributes方…...
RabbitMQ的死信队列和ttl
TTL ttl即过期时间,rbbitmq可以对队列和消息设置过期时间,当消息到存活时间之后,还没有被消费,就会被自动清除 例如:在网上购物,经常会遇到一个场景,当下单超过24小时还未付款,订单…...
[特殊字符] Hyperlane:Rust 高性能 HTTP 服务器库,开启 Web 服务新纪元!
🚀 Hyperlane:Rust 高性能 HTTP 服务器库,开启 Web 服务新纪元! 🌟 什么是 Hyperlane? Hyperlane 是一个基于 Rust 语言开发的轻量级、高性能 HTTP 服务器库,专为简化网络服务开发而设计。它支…...
【后端开发】Spring MVC-常见使用、Cookie、Session
文章目录 代码总结初始化传递参数单参数多参数 传递对象后端参数重命名(后端参数映射)必传参数设置非必传参数 传递数组传递集合传递JSON数据JSON语法JSON格式转换JSON优点传递JSON对象 获取URL中参数传递文件 Cookie与SessionCookieCookie机制 SessionC…...
Element Plus 去掉表格外边框
使用el-table组件拖拽时, 想使用自定义样式进行拖拽, 想去掉外边框, 并在表头加入竖杠样式 css代码: <style lang"less" scoped>// 表格右边框线 .el-table--border::after {width: 0; }// 表格上边框线 :deep(.el-table__i…...
安全厂商安全理念分析
奇安信(toB企业安全) 安全理念:率先提出 “内生安全” 理念。即把安全能力内置到信息化环境中,通过信息化系统和安全系统的聚合、业务数据和安全数据的聚合、IT 人才和安全人才的聚合,让安全系统像人的免疫系统一样&a…...
GaussDB Plan Hint调优实战:从执行计划控制到性能优化
GaussDB Plan Hint调优实战:从执行计划控制到性能优化 一、GaussDB Plan Hint核心价值 执行计划控制原理 mermaid graph TD A[SQL提交] --> B(优化器决策) B --> C{使用Hint?} C -->|是| D[强制指定执行路径] C -->|否| E[自动生成最优计划] D --&g…...
【力扣hot100题】(078)跳跃游戏Ⅱ
好难啊,我愿称之为跳崖游戏。 依旧用了两种方法,一种是我一开始想到的,一种是看答案学会的。 我自己用的方法是动态规划,维护一个数组记录到该位置的最少步长,每遍历到一个位置就嵌套循环遍历这个位置能到达的位置&a…...
基于 DeepSeek API 实现一个简单的数据分析 Agent
写在前面 本文将带你一步步了解: 什么是(简单的)数据分析 Agent?为什么使用 LLM 进行数据分析?如何利用 DeepSeek API 的能力?设计并实现一个基于 Python 和 Pandas 的基础数据分析 Agent。探讨其局限性、安全考量及未来方向。我们的目标是构建一个简单的 Agent,它能理…...
VUE3+TS+elementplus+Django+MySQL实现从前端增加数据存入数据库,并显示在前端界面上
一、前言 前面实现了从数据库读取数据,显示在前端界面上VUE3TSelementplusDjangoMySQL实现从数据库读取数据,显示在前端界面上,以及使用VUE3TSelementplus创建一个增加按钮。今天通过在前端的增加功能,新增数据,传到后…...
Django 创建CSV文件
Django使用Python内置的CSV库来创建动态的CSV(逗号分隔值)文件。我们可以在项目的视图文件中使用这个库。 让我们来看一个例子,这里我们有一个Django项目,我们正在实现这个功能。创建一个视图函数 getfile() 。 Django CSV例子 …...
最新版RubyMine超详细图文安装教程,带补丁包(2025最新版保姆级教程)
目录 前言 一、RubyMine最新版下载 二、RubyMine安装 三、RubyMine补丁 四、运行RubyMine 前言 RubyMine是由JetBrains开发的集成开发环境(IDE),专为Ruby和Ruby on Rails开发者设计,提供智能代码补全、调试、测试、版本控制集…...
spring之JdbcTemplate、GoF之代理模式、面向切面编程AOP
一、JdbcTemplate JdbcTemplate是Spring提供的一个JDBC模板类,是对JDBC的封装,简化JDBC代码。 当然,你也可以不用,可以让Spring集成其它的ORM框架,例如:MyBatis、Hibernate等。 接下来我们简单来学习一下&…...
【QT】QT中的文件IO
QT中的文件IO 一、有关文件IO的类二、步骤1、定义QFile的对象,与要读写的文件绑定在一起2、打开文件3、读写文件1)读取文件2)写入文件 4、关闭文件5、示例代码: 三、QString和QByteArray之间的转换1、方法2、示例代码: 四、QFileI…...
linux安装mysql常出现的问题
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum update yum install mysql-server 权限设置: chown -R mysql:mysql /var/lib/mysql/ 初始化 MySQL: mysqld --initiali…...
ArcGIS Engine开发教程--从零搭建GIS桌面应用
目录 一、ArcGIS Engine简介 1.1 什么是ArcGIS Engine? 1.2 应用场景 二、环境搭建 2.1 安装准备 2.2 配置项目 三、核心对象与基础概念 3.1 核心组件 3.2 接口编程 四、实战:开发简易地图查看器 4.1 加载地图文档 4.2 添加矢量图层 4.3 实…...
DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
Conda使用方法详解
Conda是一个开源的包管理和环境管理系统,主要用于Python/R等科学计算领域,可以轻松管理不同项目的依赖关系。以下是Conda的详细使用方法: 一、安装与配置 1.安装Miniconda/Anaconda Miniconda是精简版,只包含conda和Python Ana…...
CausalML 基于机器学习算法的因果推理方法
CausalML 是一个 Python 包,它使用基于最新研究的机器学习算法提供一套提升建模和因果推理方法。它提供了一个标准界面,允许用户从实验或观察数据中估计条件平均处理效应 (CATE),也称为个体治疗效应 (ITE&a…...
HTML的svg元素
<svg>元素 <svg>是一种用于描述二维矢量图形的 XML 格式,可以直接嵌入 HTML 文档中。 <svg>基本用法 <svg>的几种基本用法,包括圆形,正方形,三角形,直线 ,折线等 <body><svg widt…...
文件上传、读取与包含漏洞解析及防御实战
一、漏洞概述 文件上传、读取和包含漏洞是Web安全中常见的高危风险点,攻击者可通过此类漏洞执行恶意代码、窃取敏感数据或直接控制服务器。其核心成因在于开发者未对用户输入内容进行充分验证或过滤,导致攻击者能够绕过安全机制,上传或执行…...
物联网与边缘计算之物联网架构(感知层、网络层、应用层)
一、感知层:数据采集与智能终端 1. 核心功能 感知层是物联网的数据入口,通过物理设备(如传感器、RFID标签)实时采集环境、设备或生物体的物理量(温度、湿度)、标识信息(如二维码)及…...
nvm使用手册
一、安装前准备 1. 卸载现有 Node.js(如已安装) # 删除全局 node 模块 sudo rm -rf /usr/local/lib/node_modules# 删除 node 可执行文件 sudo rm -rf /usr/local/bin/npm sudo rm -rf /usr/local/bin/node# 删除其他残留文件 sudo rm -rf ~/.npm sudo…...
Maven error:Could not transfer artifact
问题描述 当项目从私有仓库下载依赖时,Maven 报错,无法从远程仓库下载指定的依赖包,错误信息如下: Could not transfer artifact com.ding.abcd:zabk-java:pom from/to releases (http://192.1122.101/repory/mavenleases/): 此…...
【操作系统(Linux)】——通过案例学习父子进程的线程异步性
本篇旨在通过几个案例来学习父子进程的线程异步性 一、父进程与子进程 我们将要做的: 创建父子进程,观察父子进程执行的顺序,了解进程执行的异步行为 源代码: #include <stdio.h> #include <sys/types.h> #include…...
汽车CAN总线采样点和采样率详解
写在前面 本篇文章主要讲解在汽车电子中CAN总线采样率的相关知识点,内容涉及CAN波特率、采样点、时间份额、同步跳转宽度以及采样率的计算。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 1、CAN波特率 CAN波特率常规分为250kbps和500kbps,本文章主要以这两个波特率为…...
一款基于 .NET 8 + Vue 开源的、企业级中后台权限管理系统
前言 今天大姚给大家分享一款基于 .NET 8 Vue 开源、前后端分离的企业级中后台权限管理系统,助力快速完成常规业务需求开发:ApeVolo.Admin。 项目介绍 ApeVolo.Admin 一款基于.NET 8、SqlSugar、Vue、Elment UI、RBAC、前后端分离、开源(…...
创建两个进程
文章目录 创建两个进程**2. 实现思路及源代码**2.1 实现思路2.1.1 fork() 函数2.1.2 思路分析 2.2 源代码2.2.1 源代码分析2.2.2 源代码测试结果 **3. 打印进程树**3.1 tmux操作步骤3.1.1 启动 tmux3.1.2 分屏操作(Ctrlb是在告诉系统准备输入一个快捷键)…...
Zephyr、FreeRTOS、RT-Thread 定时器区别分析
一、核心特性对比 特性ZephyrFreeRTOSRT-Thread定时器类型系统定时器(k_timer)、硬件定时器软件定时器(基于系统tick)软件定时器、硬件定时器定时模式单次、周期性单次、自动重载(周期性)单次、周期、自定…...
.NET 中的深拷贝实现方法
在 .NET 中实现深拷贝(Deep Copy)有几种常用方法,深拷贝是指创建一个新对象,并递归地复制原对象及其所有引用对象,而不仅仅是复制引用。 目录 1. 使用序列化/反序列化2. 使用 JSON 序列化(Newtonsoft.Json…...
Vue/React组件/指令/Hooks封装的基本原则以及示例
一、组件封装原则与示例 Vue组件封装 核心原则 • 单一职责:每个组件只解决一个功能(如分页、过滤表单) • Props控制输入:通过定义明确的Props接口接收外部数据(类型校验、默认值) • Emit事件通信:子组件通过$emit向父组件传递动作(如分页切换) • 插槽扩展性:使用…...
医学分割新标杆!双路径PGM-UNet:CNN+Mamba实现病灶毫厘级捕捉
一、引言:医学图像分割的挑战与机遇 医学图像分割是辅助疾病诊断和治疗规划的关键技术,但传统方法常受限于复杂病理特征和微小结构。现有深度学习模型(如CNN和Transformer)虽各有优势,但CNN难以建模长距离依赖&…...
软考-高项,知识点一览十六 采购管理
十六 采购管理 项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。被授权采购项目所需货物、服务的人员可以是项目团队、管理层或组织采购部的成员 。 管理基础 协议/采购合同 协议可以是合同、服务水平协议 (SLA) 、谅解备忘录、协议备…...
Spring MVC 视图解析器(JSP、Thymeleaf、Freemarker、 JSON/HTML、Bean)详解
Spring MVC 视图解析器详解 1. 视图解析器概述 视图解析器(ViewResolver)是 Spring MVC 的核心组件,负责将控制器返回的视图名称(如 success)转换为具体的 View 对象(如 Thymeleaf 模板或 JSP 文件&#x…...
Joomla 常用模块 - 在线用户与Joomla 常用模块 - 自定义HTML模块
Joomla 常用模块 - 在线用户 在这一节中,我们将介绍如何建立在线用户模块。在线用户模块是显示当前访问网站的匿名用户(如访客)和注册用户(登录用户)的数量。 建立在线用户模块你可以参考以下步骤: 1、选…...
缓存工具类
这里写目录标题 背景代码使用 背景 写oj系统过程中,需要使用缓存工具类。其功能为,先从缓存中获取数据,如数据不存在,从数据库中获取。 代码 package xyz.wry.utils;import org.springframework.util.ObjectUtils;import java.…...
【C++】list底层封装和实现
目录 节点类基本框架构造函数 list类构造函数拷贝构造函数赋值重载析构函数 迭代器类前言(string和vector的区别)迭代器模版参数的说明构造函数运算符重载- -运算符的重载运算符重载!运算符的重载*运算符的重载->运算符的重载 迭代器相关函数插入和删除函数inserterase函数p…...
一种替代DOORS在WORD中进行需求管理的方法 (二)
一、前景 参考: 一种替代DOORS在WORD中进行需求管理的方法(基于WORD插件的应用)_doors aspice-CSDN博客 二、界面和资源 WORD2013/WORD2016 插件 【已使用该工具通过第三方功能安全产品认证】: 1、 核心功能 1、需求编号和跟…...
学习海康VisionMaster之多直线查找
一:进一步学习了 今天学习下VisionMaster中的多直线查找,这个还是拟合直线的衍生应用,可以在测量框内同时查找多段时间 二:开始学习 1:什么是多直线查找? 一个检测框,就可以在检测框里面同时检…...
MATLAB的24脉波整流器Simulink仿真与故障诊断
本博客来源于CSDN机器鱼,未同意任何人转载。 更多内容,欢迎点击本专栏目录,查看更多内容。 目录 0 引言 1 故障数据采集 2 故障特征提取 3 故障诊断分类 4 结语 本博客内容是在MATLAB2023下完成。 0 引言 对于电力电子电路的故障诊断…...
顺序表专题(C语言)
文章目录 前言一、数据结构相关概念类比说明:书架与数据结构 二、线性表基本概念两种实现方式对比 三、顺序表的概念及结构1. 顺序表的定义2. 静态顺序表的基本结构关键点解析: 3. 结构体成员解释 四、顺序表分类五、动态顺序表的实现总结 前言 在C语言…...
Python Cookbook-5.9 在排序完毕的序列中寻找元素
任务 你需要寻找序列中的一系列元素。 解决方案 解决方案如果列表L已经是排序完毕的状态,则Python 标准库提供的 bisect 模块可以很容易地检查出元素x是否在L中: import bisect x_insert_point bisect.bisect_right(L,x) x_is_present L[x_insert_point-1:x_i…...
Johnson算法 流水线问题 java实现
某印刷厂有 6项加工任务J1,J2,J3,J4,J5,J6,需要在两台机器Mi和M2上完 成。 在机器Mi上各任务所需时间为5,1,8,5,3,4单位; 在机器M2上各任务所需时间为7,2,2,4,7,4单位。 即时间矩阵为: T1 {5, …...