Spring Boot中自定义注解的创建与使用
🌟 前言
欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍
🤖 洛可可白:个人主页
🔥 个人专栏:✅前端技术 ✅后端技术
🏠 个人博客:洛可可白博客
🐱 代码获取:bestwishes0203
📷 封面壁纸:洛可可白wallpaper

Spring Boot中自定义注解的创建与使用
- Spring Boot中自定义注解的创建与使用
- 一、什么是自定义注解?
- 二、创建自定义注解
- (一)定义注解
- (二)注解的元注解
- (三)注解的属性
- 三、使用自定义注解
- (一)在Spring中使用自定义注解
- 1. 创建自定义注解
- 2. 创建切面类
- 3. 使用自定义注解
- (二)通过反射获取注解信息
- 1. 定义注解
- 2. 使用注解
- 3. 通过反射获取注解信息
- 四、自定义注解的高级用法
- (一)注解的组合
- (二)注解的继承
- (三)注解的动态处理
- 五、实际应用场景
- (一)日志记录
- 示例:记录方法的调用信息
- (二)权限校验
- 示例:定义一个`@RequiresPermission`注解
- 创建切面类处理权限校验
- 使用`@RequiresPermission`注解
- (三)性能监控
- 示例:定义一个`@MonitorPerformance`注解
- 创建切面类处理性能监控
- 使用`@MonitorPerformance`注解
- 六、最佳实践
- (一)合理使用注解
- (二)结合AOP使用
- (三)避免滥用反射
- 七、总结
Spring Boot中自定义注解的创建与使用
在Spring Boot中,自定义注解是一种强大的工具,它可以帮助我们实现代码的解耦、增强代码的可读性和可维护性。通过自定义注解,我们可以在代码中添加特定的标记,Spring框架可以识别这些标记并执行相应的逻辑。本文将详细介绍如何在Spring Boot中创建和使用自定义注解。
一、什么是自定义注解?
注解(Annotation)是Java语言中的一种元数据形式,它为程序元素(如类、方法、字段等)提供了一种附加信息的机制。自定义注解是指开发者根据自己的需求定义的注解。通过自定义注解,可以在代码中添加特定的标记,Spring框架可以识别这些标记并执行相应的逻辑。
二、创建自定义注解
(一)定义注解
自定义注解的定义需要使用@interface
关键字。以下是一个简单的自定义注解@Log
的定义:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD) // 指定注解可以使用的范围,这里是方法
@Retention(RetentionPolicy.RUNTIME) // 指定注解的保留策略,这里是运行时
public @interface Log {String operation() default ""; // 定义注解的属性,这里是一个字符串类型的属性
}
(二)注解的元注解
在定义自定义注解时,通常会使用一些元注解来指定注解的特性和行为:
-
@Target:指定注解可以使用的范围,例如类、方法、字段等。常用的值包括:
ElementType.TYPE
:可以用于类、接口或枚举。ElementType.METHOD
:可以用于方法。ElementType.FIELD
:可以用于字段。ElementType.PARAMETER
:可以用于方法参数。
-
@Retention:指定注解的保留策略,即注解在什么阶段可用。常用的值包括:
RetentionPolicy.SOURCE
:注解仅在源代码阶段保留,编译时会被丢弃。RetentionPolicy.CLASS
:注解在编译阶段保留,但在运行时不可用。RetentionPolicy.RUNTIME
:注解在运行时保留,可以通过反射获取。
-
@Documented:表示注解应该被Javadoc工具记录。
-
@Inherited:表示注解可以被子类继承。
(三)注解的属性
注解可以定义属性,这些属性可以在注解使用时提供具体的值。属性的定义类似于接口中的方法定义。例如:
public @interface Log {String operation() default ""; // 字符串类型的属性boolean enabled() default true; // 布尔类型的属性
}
三、使用自定义注解
(一)在Spring中使用自定义注解
在Spring框架中,可以通过AOP(面向切面编程)来处理自定义注解。以下是一个完整的示例,展示如何使用自定义注解@Log
来记录方法的调用信息。
1. 创建自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {String operation() default "";
}
2. 创建切面类
使用@Aspect
注解定义一个切面类,拦截带有@Log
注解的方法,并记录日志:
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;@Aspect
@Component
public class LogAspect {private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);// 定义切入点,拦截带有@Log注解的方法@Pointcut("@annotation(Log)")public void logPointCut() {}// 环绕通知,记录方法的调用信息@Around("logPointCut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {long startTime = System.currentTimeMillis();// 获取方法上的注解MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();Log logAnnotation = method.getAnnotation(Log.class);// 执行方法Object result = joinPoint.proceed();long timeTaken = System.currentTimeMillis() - startTime;logger.info("Method: {}, Operation: {}, Time Taken: {} ms",method.getName(), logAnnotation.operation(), timeTaken);return result;}
}
3. 使用自定义注解
在需要记录日志的方法上添加@Log
注解:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Log(operation = "查询用户信息")@GetMapping("/user")public String getUser() {return "User Data";}
}
(二)通过反射获取注解信息
除了在Spring框架中使用AOP处理注解外,还可以通过反射机制直接获取注解信息。以下是一个示例:
1. 定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {String operation() default "";
}
2. 使用注解
public class UserService {@Log(operation = "查询用户信息")public String getUser() {return "User Data";}
}
3. 通过反射获取注解信息
import java.lang.reflect.Method;public class AnnotationProcessor {public static void main(String[] args) throws NoSuchMethodException {Method method = UserService.class.getMethod("getUser");if (method.isAnnotationPresent(Log.class)) {Log logAnnotation = method.getAnnotation(Log.class);System.out.println("Operation: " + logAnnotation.operation());}}
}
四、自定义注解的高级用法
(一)注解的组合
可以定义一个注解组合多个注解。例如,定义一个@Loggable
注解,组合了@Log
和@Transactional
:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.transaction.annotation.Transactional;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Transactional
public @interface Loggable {String operation() default "";
}
然后在方法上使用@Loggable
注解:
@Loggable(operation = "查询用户信息")
public String getUser() {return "User Data";
}
(二)注解的继承
虽然注解本身不能直接继承,但可以通过组合注解来实现类似的效果。例如,定义一个@BaseLog
注解,然后在其他注解中使用它:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BaseLog {String operation() default "";
}@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@BaseLog
public @interface Log {String operation() default "";
}
(三)注解的动态处理
在Spring框架中,可以通过@Bean
注解和BeanPostProcessor
接口动态处理注解。例如,定义一个@MyBean
注解,并通过BeanPostProcessor
动态注册Bean:
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyBean {
}@Configuration
public class MyBeanConfig {@Beanpublic BeanPostProcessor myBeanPostProcessor() {return new BeanPostProcessor() {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {Class<?> beanClass = bean.getClass();if (beanClass.isAnnotationPresent(MyBean.class)) {System.out.println("Bean " + beanName + " is annotated with @MyBean");}return bean;}};}
}@MyBean
public class MyService {public void doSomething() {System.out.println("Doing something...");}
}
五、实际应用场景
(一)日志记录
日志记录是自定义注解最常见的应用场景之一。通过自定义注解,我们可以方便地在方法调用前后插入日志逻辑,而无需在每个方法中手动编写日志代码。这不仅减少了代码冗余,还提高了代码的可维护性。
示例:记录方法的调用信息
在前面的示例中,我们已经展示了如何通过@Log
注解记录方法的调用信息。这种方法特别适用于需要对系统操作进行审计的场景,例如记录用户的操作行为、方法的执行时间等。
(二)权限校验
在许多应用程序中,某些方法可能需要特定的权限才能执行。通过自定义注解,我们可以方便地实现权限校验逻辑,而无需在每个方法中手动编写权限校验代码。
示例:定义一个@RequiresPermission
注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermission {String value();
}
创建切面类处理权限校验
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;@Aspect
@Component
public class PermissionAspect {@Pointcut("@annotation(RequiresPermission)")public void permissionPointCut() {}@Before("permissionPointCut()")public void checkPermission(JoinPoint joinPoint) {MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();RequiresPermission annotation = method.getAnnotation(RequiresPermission.class);String requiredPermission = annotation.value();// 模拟权限校验逻辑if (!hasPermission(requiredPermission)) {throw new SecurityException("Access denied: " + requiredPermission);}}private boolean hasPermission(String permission) {// 实际应用中,这里可以调用权限服务进行校验return true; // 示例中直接返回true}
}
使用@RequiresPermission
注解
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class AdminController {@RequiresPermission("ADMIN_ACCESS")@GetMapping("/admin/data")public String getAdminData() {return "Admin Data";}
}
(三)性能监控
在一些对性能要求较高的系统中,我们可能需要监控某些方法的执行时间。通过自定义注解,我们可以方便地实现性能监控逻辑,而无需在每个方法中手动编写性能监控代码。
示例:定义一个@MonitorPerformance
注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MonitorPerformance {
}
创建切面类处理性能监控
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;@Aspect
@Component
public class PerformanceAspect {@Pointcut("@annotation(MonitorPerformance)")public void performancePointCut() {}@Around("performancePointCut()")public Object monitorPerformance(ProceedingJoinPoint joinPoint) throws Throwable {long startTime = System.currentTimeMillis();Object result = joinPoint.proceed();long timeTaken = System.currentTimeMillis() - startTime;System.out.println("Method: " + joinPoint.getSignature().getName() + " took " + timeTaken + " ms");return result;}
}
使用@MonitorPerformance
注解
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DataService {@MonitorPerformance@GetMapping("/data")public String getData() {// 模拟耗时操作Thread.sleep(1000);return "Data";}
}
六、最佳实践
(一)合理使用注解
虽然自定义注解非常强大,但过度使用可能会导致代码难以理解和维护。因此,在使用自定义注解时,应遵循以下原则:
- 明确注解的用途:每个注解应该有明确的用途,避免注解的功能过于复杂。
- 保持注解的简洁性:注解的定义应该尽量简洁,避免过多的属性。
- 合理使用元注解:根据注解的用途,合理选择
@Target
、@Retention
等元注解。
(二)结合AOP使用
在Spring框架中,自定义注解通常与AOP结合使用。通过AOP,我们可以在不修改业务逻辑代码的情况下,插入额外的逻辑(如日志记录、权限校验等)。这种解耦的方式不仅提高了代码的可维护性,还增强了代码的可扩展性。
(三)避免滥用反射
虽然反射可以动态获取注解信息,但反射的性能开销较大,且代码可读性较差。因此,在使用反射时,应尽量避免滥用。在Spring框架中,优先使用AOP来处理注解逻辑。
七、总结
自定义注解是Java和Spring框架中一个非常强大的功能,它可以帮助我们实现代码的解耦、增强代码的可读性和可维护性。通过定义自定义注解,我们可以在代码中添加特定的标记,Spring框架可以识别这些标记并执行相应的逻辑。本文通过多个实际应用场景,展示了如何在Spring Boot中创建和使用自定义注解。
希望本文对你理解和使用自定义注解有所帮助。如果你有任何问题或建议,欢迎在评论区留言,我们一起交流学习!
如果对你有帮助,点赞👍、收藏💖、关注🔔是我更新的动力!👋🌟🚀
相关文章:
Spring Boot中自定义注解的创建与使用
🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…...
算法思想之双指针(二)
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之双指针二) 发布时间:2025.4.5 隶属专栏:算法 目录 双指针算法介绍对撞指针:快慢指针: 例题有效三角形的个数题目链接题目描述算法思路代码实现 查找总价格为…...
MySQL基础 [一] - 数据库基础
目录 什么是数据库 站在服务器角度理解 站在用户角度理解 为什么不直接使用文件存储呢? 主流数据库 MySQL的基本使用 数据库的使用样例 服务器管理 服务器数据库表之间的关系 MySQL的架构 MySQL语句分类 存储引擎 查看存储引擎 存储引擎对比 什么…...
智能合约的法律挑战与解决之道:技术与法律的交融
智能合约的法律挑战与解决之道:技术与法律的交融 智能合约的诞生,为区块链技术的应用打开了新的大门。从简单的自动化交易到复杂的去中心化自治组织(DAO),智能合约正在推动全球经济迈向去信任化的新时代。然而&#x…...
MySQL基础 [一] - Ubuntu版本安装
目录 预安装 先查看自己操作系统的版本 添加MySQL APT下载源 下载 安装 正式安装 查看MySQL状态 打开MySQL 预安装 先查看自己操作系统的版本 lsb_release -a 添加MySQL APT下载源 下载 下载发布包 下载地址 : https://dev.mysql.com/downloads/repo/apt/ 这里下…...
cursor机器码重置
1、下载vscode插件 cursor-fake-machine-0.0.2 2、将插件拖入拓展 3、彻底将cursor账号退出 setting -> Manage -> 退出账号 4、打开cursor,ctrlshiftp ,输入fake,点击确定...
深度学习的疑问--综合【2】:像CNN,GNN,transformer等这些模型都是用于提取特征,然后经过全连接层实现分类的吗?
总结: CNN,GNN,transformer等这些模型都是用于提取特征;FC、MLP等用于实现分类,MLP即是多个FC组成的。 是的,从高层次来看,CNN(卷积神经网络)、GNN(图神经网络…...
基于编程的运输设备管理系统设计(vue+springboot+ssm+mysql8.x)
基于编程的运输设备管理系统设计(vuespringbootssmmysql8.x) 运输设备信息管理系统是一个全面的设备管理平台,旨在优化设备管理流程,提高运输效率。系统提供登录入口,确保只有授权用户可以访问。个人中心让用户可以查…...
SpringBoot整合MyBatis
一、SpringBoot整合MyBatis 步骤1:创建新模块,选择Spring初始化,并配置模块相关基础信息 步骤2:选择当前模块需要使用的技术集(MyBatis、MySQL) 步骤3:设置数据源参数 spring:datasource:dr…...
kali——masscan
目录 前言 使用方法 前言 Masscan 是一款快速的端口扫描工具,在 Kali Linux 系统中常被用于网络安全评估和渗透测试。 使用方法 对单个IP进行端口扫描: masscan -p11-65535 192.168.238.131 扫描指定端口: masscan -p80,22 192.168.238.131…...
数字化转型中的开源AI智能客服与S2B2C商城小程序的融合创新
摘要 数字经济时代,企业需通过技术重构用户交互与供应链体系。本文以“开源AI智能客服”“AI智能名片”及“S2B2C商城小程序”为核心,研究三者如何通过技术协同与场景化应用实现企业营销、客户服务与供应链管理的智能化升级。通过案例分析、技术架构设…...
2-Docker常用命令
1. Docker 帮助启动类命令 1.1 启动 docker: systemctl start docker [rootlocalhost ~]# systemctl start docker1.2 停止 docker: systemctl stop docker [rootlocalhost ~]# systemctl stop docke1.3 重启 docker: systemctl restart d…...
理解OSPF 特殊区域NSSA和各类LSA特点
本文基于上文 理解OSPF Stub区域和各类LSA特点 在理解了Stub区域之后,我们再来理解一下NSSA区域,NSSA区域用于需要引入少量外部路由,同时又需要保持Stub区域特性的情况 一、 网络总拓扑图 我们在R1上配置黑洞路由,来模拟NSSA区域…...
Chapter01_绪论
文章目录 数字图像处理导论⭐图像的分类数字图像处理的概念(狭义)⭐数字图像处理的基本特征图像分析 ⭐数字图像处理的组成⭐数字图像处理研究的基本内容 数字图像处理导论 ⭐图像的分类 模拟图像:二维空间和亮度值都是连续(值&a…...
SDL显示YUV视频
文章目录 1. **宏定义和初始化**2. **全局变量**3. **refresh_video_timer 函数**4. **WinMain 函数**主要功能及工作流程:总结: 1. 宏定义和初始化 #define REFRESH_EVENT (SDL_USEREVENT 1) // 请求画面刷新事件 #define QUIT_EVENT (SDL…...
频域滤波函数 To 空域冲激响应函数
从频域滤波函数 H ( u , v ) H(u, v) H(u,v)到空域冲激响应函数 h ( x , y ) h(x, y) h(x,y)的变换。 不是冈萨雷斯这么简单的IDFT,有两次移位。这么费劲是因为DFT定义在第一象限。而且要求滤波器的尺寸为奇数,零的个数没有影响。 逆中心移位变换&…...
【C++】C++11<包装器没写>
文章目录 一、初始化列表的统一1.列表初始化2.initializer_list 二、声明1.auto2.decltype3.nullptr 三、范围for四、智能指针五、STL中的变化1.新容器arrayforward_list 2.接口 六、右值引用1.左值引用和右值引用2.右值引用的使用场景和意义3.左值引用和右值引用的价值和场景4…...
《如何避免虚无》速读笔记
文章目录 书籍信息概览躺派(出世)卷派(入世)虚无篇:直面虚无自我篇:认识自我孤独篇:应对孤独幸福篇:追寻幸福超越篇:超越自我 书籍信息 书名:《如何避免虚无…...
【微机及接口技术】- 第四章 内部存储器及其接口(中)
文章目录 第三节 半导体存储器与CPU的连接一、存储芯片与CPU连接中应关注的问题二、存储器扩展1. 位扩展:2. 字扩展3. 字位扩展 三、实现片选控制的方法1. 全译码法2. 部分译码法3. 线选法 第三节 半导体存储器与CPU的连接 一、存储芯片与CPU连接中应关注的问题 C…...
Mysql 数据库下载安装
安装准备 步骤1:输入WindowsMysql下载地址:https://dev.mysql.com/downloads/,选择MySQL Installer for Windows。 步骤2:下载MySQL安装文件 mysql-install-community-8.0.22.0.msi 步骤3:登录MySQL, 如…...
蓝桥杯刷题笔记
奇怪的捐赠 #include <cstdio> #include <iostream> #include <cmath> using namespace std; int main(){// 初始化变量num为1000000,代表总金额为100万元int num 1000000;// 初始化变量cnt为0,用于记录最终划分的份数int cnt 0;//…...
数仓开发团队日常1
第一章:数据的召唤 2005年7月18日,星期一,上午8:30 城市商业银行总行大楼 盛夏的阳光透过高耸的银行大楼玻璃幕墙,在大理石地面上投下斑驳的光影。李明远站在城市商业银行总行大厦前,抬头望着这座在城市金融区并不算高的建筑,却感到一种莫名的压迫感。他整了整领带,深…...
Pgvector的安装
Pgvector的安装 向量化数据的存储,可以为 PostgreSQL 安装 vector 扩展来存储向量化数据 注意:在安装vector扩展之前,请先安装Postgres数据库 vector 扩展的步骤 1、下载vs_BuildTools 下载地址: https://visualstudio.microso…...
学习笔记—C++—入门基础()
目录 C介绍 参考文档 C第一个程序 命名空间namespace namespace的价值 namespace的定义 namespace使用 指定命名空间访问 using将命名空间中某个成员展开 展开命名空间中全部成员 输入和输出 缺省参数 函数重载 引用 引用的概念 应用 const引用 指针和引用的关…...
Pytorch实现之利用深度残差GAN做运动图像的去模糊
简介 简介:采用类似U-Net的解码编码的结构,结合10层的残差连接结构作为生成器,改进PatchGAN得到更大的感受野来作为鉴别器。生成器的损失为内容损失,鉴别器的损失为WGAN-GP损失。大家可以尝试这个模型来解决运动图像的去模糊化。 论文题目:基于深度残差生成对抗网络的运…...
[Windows] XHS-Downloader V2.4 | 小红书无水印下载工具 支持多平台批量采集
[Windows] XHS-Downloader 链接:https://pan.xunlei.com/s/VON4ygFN1JcyzLJJIOqIpqodA1?pwdsinu# XHS-Downloader 是一款开源免费的小红书内容下载工具,支持无水印视频 / 图文提取、多链接批量处理及账号作品采集。其核心优势包括: 全平台…...
从零构建大语言模型全栈开发指南:附录与资源-2.数据集大全-公开语料库、多模态数据集与领域专用数据源
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 附录与资源-2. 数据集大全:公开语料库、多模态数据集与领域专用数据源一、公开语料库:通用语言模型的基石1.1 主流文本语料库1.2 预处理工具与策略二、多模态数据集:跨模态理解的桥梁2.1 视觉-语言数…...
SDL多线程编程
文章目录 1. SDL 线程基础2. 线程同步3. 线程池4. 注意事项5. 示例:在多个线程中进行图形渲染和输入处理总结在 SDL(Simple DirectMedia Layer)中,多线程编程通常用于提高应用程序的响应性和性能,尤其是在需要同时处理多个任务的场景中,例如渲染、输入处理和音频等。SDL …...
LINUX 4 tar -zcvf -jcvf -Jcvf -tf -uf
cp -r mv: 1.移动文件到目录 2.文件改名 3.目录改名 s 上面是打包 下面是打包并压缩...
STL剖析
1. vector 是一个封装了动态大小数组的顺序容器;数组内容器严格按照线性顺序排序,支持随机访问,因此提供随机访问指针,例如vector::iterator ivite; 并且为了降低空间配置得速度成本,vector实际分配大小要比需求大一点…...
【数据集】Romanov数据集
1. 数据集背景 名称:Romanov 单细胞转录组数据集 来源:Romanov et al., Cell Reports, 2017 原始论文标题: "Molecular interrogation of hypothalamic organization reveals distinct dopamine neuronal subtypes" GEO Accession…...
Baklib企业CMS的核心要素是什么?
企业CMS工作流协同创新 现代企业内容管理的核心挑战在于多角色协作效率与流程可视化的平衡。以Baklib为代表的协同型CMS,通过动态权限分级架构与实时版本追踪技术,构建了从内容草拟、多级审批到版本发布的完整闭环。系统支持多人同时编辑功能࿰…...
JavaWeb 课堂笔记 —— 02 JavaScript
本系列为笔者学习JavaWeb的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)》,章节分布参考视频教程,为同样学习…...
Kafka 回溯消费
Kafka 回溯消费 是一个非常实用的能力,尤其当你: 消费端挂掉/处理异常消息数据出错/业务需要重跑要对某一段历史数据“重新拉取并消费”日志审计/数据补偿/BI分析 下面我来详细讲讲 Kafka 如何实现“回溯消费”,并配上使用方式、注意事项 &…...
LeetCode算法题(Go语言实现)_32
题目 在一个大小为 n 且 n 为 偶数 的链表中,对于 0 < i < (n / 2) - 1 的 i ,第 i 个节点(下标从 0 开始)的孪生节点为第 (n-1-i) 个节点 。 比方说,n 4 那么节点 0 是节点 3 的孪生节点,节点 1 是…...
CSS Text(文本)学习笔记
一、文本格式化 CSS 提供了多种文本格式化属性,用于控制文本的外观和布局。这些属性可以改变文本的颜色、对齐方式、修饰、大小写转换、缩进等。 1. 文本颜色 CSS 的 color 属性用于设置文本的颜色。颜色可以通过以下方式指定: 十六进制值:…...
MySQL篇(五)MySQL主从同步原理深度剖析
MySQL篇(五)MySQL主从同步原理深度剖析 MySQL篇(五)MySQL主从同步原理深度剖析一、引言二、MySQL主从同步基础概念主库(Master)从库(Slave)二进制日志(Binary Log&#x…...
AGI大模型(10):prompt逆向-巧借prompt
1 提示词逆向 明确逆向提示词⼯程概念 我们可以给ChatGPT提供⼀个简洁的提示词,让它能够更准确地理解我们所讨论的“逆向提示词⼯程”是什么意思,并通过这个思考过程,帮它将相关知识集中起来,进⽽构建⼀个专业的知识领域 提示词:请你举⼀个简单的例⼦,解释⼀下逆向pro…...
【问题记录】C语言一个程序bug定位记录?(定义指针数组忘记[])
背景 写了个小的程序,一直段错误。特此记录 代码 主要代码 int main_mytest(int argc, char *argv) {char *argv_my {"echo","/proc/cpuinfo",};main_mytest(sizeof(argv_my)/sizeof(char*), argv_my); }int main_mytest(int argc, char *a…...
Systemd构建自动化备份服务与外部存储管理
实训背景 你是一家数据公司的系统管理员,需设计一套自动化备份系统,满足以下需求: 定期备份:每周日凌晨1点将 /data 目录压缩备份到 /backups。外部存储挂载:插入USB设备时自动挂载到 /mnt/usb,并触发增量…...
基于Python的微博数据采集
摘要 本系统通过逆向工程微博移动端API接口,实现了对热门板块微博内容及用户评论的自动化采集。系统采用Requests+多线程架构,支持递归分页采集和动态请求头模拟,每小时可处理3000+条数据记录。关键技术特征包括:1)基于max_id的评论分页递归算法 2)HTML标签清洗正则表达…...
Linux | I.MX6ULL开发板固件烧录所需文件详述(9)
01 搞清楚手里的开发板是 EMMC 还是 NAND FLASH 。默认我的商业级是EMMC ,开关:10011010 终结者i.MX6ULL 开卡板分为工业级和商业级两种不同的开发板。 商业级的核心板,它的存储是 EMMC 的,EMMC 的存储是类似于正方形的芯片,旁边是 NAND FLASH的一个封装,因为我们这里…...
单片机实现多线程的方法汇总
在单片机上实现“多线程”的方法有几种,下面按照从简单到复杂、从轻量到系统性来列出常见的方案: 🧵 一、伪多线程(最轻量) 方法:主循环 状态机 / 定时器轮询 主循环中轮流调用各个任务的处理函数&#x…...
探秘叁仟智盒设备:智慧城市的智能枢纽
在智慧城市建设的宏伟蓝图中,各类先进技术与设备层出不穷,叁仟智盒设备作为其中的关键一环,正悄然发挥着巨大作用,为城市的智能化转型注入强大动力。 一、叁仟智盒设备概述 叁仟智盒设备是杭州叁仟智慧城市科技有限公司旗下的重…...
(一)前端程序员转安卓开发分析和规划建议
最近因为公司前端业务萎缩,考虑内部转安卓开发岗,结合自己的经验分享几点建议。前端程序员转安卓开发是一个值得深入分析和规划的职业转型选择。以下是对这一转型的详细分析以及具体的规划建议,帮助大家更好地理解和准备这一转变。 一、技能和…...
配置管理:夯实软件开发与运维根基
配置管理是对系统配置信息进行管理的活动,以下从定义、目的、主要活动、实施流程等方面为你详细介绍: 一、定义 配置管理是通过技术或行政手段对软件产品及其开发过程和生命周期进行控制、规范的一系列措施。配置管理的目标是记录软件产品的演化过程&a…...
PyTorch构建自定义模型
PyTorch 提供了灵活的方式来构建自定义神经网络模型。下面我将详细介绍从基础到高级的自定义模型构建方法,包含实际代码示例和最佳实践。 一、基础模型构建 1. 继承 nn.Module 基类 所有自定义模型都应该继承 torch.nn.Module 类,并实现两个基本方法&…...
JVM虚拟机篇(一)深入理解JVM:组成部分、运行流程及程序计数器详解
JVM虚拟机篇(一)深入理解JVM:组成部分、运行流程及程序计数器详解 JVM虚拟机篇(一)深入理解JVM:组成部分、运行流程及程序计数器详解一、引言二、JVM的组成部分2.1 类加载子系统2.2 运行时数据区2.3 执行引…...
从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.1.2Tokenization策略:BPE算法与词表设计
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 3.1.2 Tokenization策略:BPE算法与词表设计1. BPE(Byte-Pair Encoding)算法原理与实现1.1 BPE核心思想1.2 BPE算法步骤2. 词表设计关键要素2.1 词表规模与模型性能2.2 特殊标记设计3. BPE变体与改进算…...
学透Spring Boot — 013. Spring Web-Flux 函数式风格的控制器
这是我的学透Spring Boot的第13篇文章,更多文章请移步我的专栏 学透 Spring Boot_postnull咖啡的博客-CSDN博客 目录 传统风格的Spring MVC 函数式编程风格的Spring MVC 引入WebFlux依赖 定义Handler类 定义Router类 WebFlux不生效 灵魂拷问 Spring Web MVC…...