蔡定努
人前拼实力,人后拼努力
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Spring Boot + Flink CDC + MongoDB:打造实时数据变化监听与策略路由系统
本文提出了一种基于Spring Boot + Flink CDC + MongoDB的实时数据管道方案,解决了传统微服务架构中数据库变更监听实时性差、代码侵入性高的问题。该方案通过Flink捕获MongoDB变更事件,并由Spring Boot进行策略路由与业务处理,实现零侵入、低延迟、高扩展的数据变更响应。文章详细介绍了整体架构、核心组件实现(包括配置中心、Flink CDC任务、反序列化与策略路由等),并列举了典型应用场景和开发中遇到的常见问题。该方案无需修改业务代码,支持毫秒级事件处理,新增表只需简单原创 2025-08-20 10:17:58 · 27 阅读 · 0 评论 -
基于 ShardingSphere 的 Spring Boot 数据加密与模糊查询实现
本文介绍了基于ShardingSphere和Spring Boot实现数据加密与模糊查询的完整解决方案。项目采用AES加密敏感数据,通过ShardingSphere的CHAR_DIGEST_LIKE加密器支持加密字段的模糊查询功能。配置包括数据源设置、加密规则定义(AES、MD5和模糊查询专用加密器)以及特殊设计的数据库表结构(添加salary_like字段)。该方案既保障了数据安全,又解决了加密数据难以进行模糊匹配的难题,适用于需要同时满足数据保护和复杂查询需求的场景。原创 2025-08-06 14:25:48 · 140 阅读 · 0 评论 -
MyBatis-Plus 实战:敏感字段自动加解密支持模糊查询
本文基于MyBatis-Plus框架提出了一种全链路敏感字段加密方案。通过自定义TypeHandler实现数据入库自动加密和查询自动解密,结合重写LambdaQueryWrapper处理查询条件加密,并适配多种查询方式。方案核心包括:1)AESUtil工具类提供加解密基础能力;2)EncryptTypeHandler实现字段类型转换;3)实体类通过注解配置加密字段。该方案在保证数据安全的同时,对业务代码侵入性小,支持姓名、手机号等敏感信息的全流程加密处理,满足系统开发的安全需求。原创 2025-08-01 12:05:13 · 66 阅读 · 0 评论 -
使用 Prometheus 监控 Spring Boot 应用
本文介绍了使用SpringBoot+Prometheus+Grafana实现应用监控的方案。首先在SpringBoot项目中集成Micrometer和Actuator组件,通过配置暴露Prometheus监控端点。接着配置Prometheus采集应用指标数据,并通过Grafana可视化展示。具体步骤包括:1)SpringBoot集成Micrometer;2)配置Prometheus抓取应用指标;3)安装Grafana并导入SpringBoot监控模板;4)展示JVM和业务指标。该方案可以实现对SpringB原创 2025-06-16 11:43:23 · 212 阅读 · 0 评论 -
Git标签删除脚本解析与实践:轻松管理本地与远程标签
本文介绍了一个用于删除本地和远程 Git 标签的脚本,并详细解析了其逻辑和使用注意事项。脚本首先检查本地标签,若不存在则从远程拉取,随后批量删除本地标签。接着,脚本检查远程标签,并通过循环逐个删除。使用该脚本时需注意权限问题、备份重要标签以及处理特殊字符。通过合理运用该脚本,开发者可以更高效地管理 Git 标签,确保版本控制的清晰和规范。原创 2025-05-09 14:40:15 · 292 阅读 · 0 评论 -
Spring Boot 依赖配置分离多种打包方式
springboot中依赖分离打包方式原创 2025-01-03 18:27:25 · 717 阅读 · 0 评论 -
ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal
复制之后,父子线程中的InheritableThreadLocal就没有关系了,父线程中InheritableThreadLocal的值再修改,也不会影响子线程中的值了,所以两次输出的都是张三。从结果中看,线程池执行了2次任务,2次拿到的都是张三,和主线程第一次放入的值是一样的,而第二次主线程中放入的是李四啊,但是第二次线程池中拿到的却是张三,这是什么原因?上面线程池的大小是1,也就是说这个线程池中只有一个线程,所以让线程池执行的2次任务用到的都是一个线程,从上面的日志中可以看到线程名称都是。原创 2024-12-30 10:49:45 · 138 阅读 · 0 评论 -
java 根据 pdf 模板带图片文字生成pdf文件
在现代应用开发中,自动生成包含动态内容的 PDF 文档在电子发票、合同生成、表单填充等场景中有着广泛的应用。本文将介绍如何使用 iText 库动态填充 PDF 模板字段,并在指定位置插入签名和公章图片。项目需求假设我们有一个 PDF 模板文件,包含表单字段,如用户姓名、地址、爱好等,以及需要插入的签名和公章图片。我们将使用 iText 库读取 PDF 模板,填充字段数据,并在指定位置插入签名和公章图片,生成最终的 PDF 文件。技术实现使用的主要依赖。原创 2024-11-15 18:46:33 · 408 阅读 · 0 评论 -
本地 SSL 证书生成神器,自己创建SSL
mkcert是由Filippo Valsorda开发的一款免费开源工具,专门用于生成受信任的本地SSL/TLS证书。它通过简单命令自动生成并安装本地信任的证书,让本地环境中的HTTPS配置变得轻松无比。mkcert支持多个操作系统,满足不同开发者的需求。本文以mac为例。原创 2024-11-13 14:04:03 · 149 阅读 · 0 评论 -
本地 SSL 证书生成神器,自己创建SSL
mkcert是由Filippo Valsorda开发的一款免费开源工具,专门用于生成受信任的本地SSL/TLS证书。它通过简单命令自动生成并安装本地信任的证书,让本地环境中的HTTPS配置变得轻松无比。mkcert支持多个操作系统,满足不同开发者的需求。本文以mac为例。原创 2024-11-13 12:03:07 · 389 阅读 · 0 评论 -
springboot中返回数据脱敏
特别是在返回用户信息的 API 中,我们通常希望敏感字段(如姓名、身份证、电话号码、地址等)经过脱敏处理后再返回。@Sensitive 注解用于标记需要脱敏的字段,并指定脱敏策略。此脱敏方案适合在 Spring Boot 中使用,特别是数据敏感性较高的场景,如用户信息管理、支付信息保护等。首先,创建 Person 实体类,并在敏感字段上使用 @Sensitive 注解指定脱敏策略。:通过 SensitiveStrategy 枚举,可以轻松扩展新的脱敏策略。@Sensitive:用于标注字段的脱敏策略。原创 2024-11-12 14:50:02 · 416 阅读 · 0 评论 -
Jar 包加密混淆工具 ClassFinal
ClassFinal 是一款 java class 文件安全加密工具,支持直接加密 jar 包或 war 包,无需修改任何项目代码,兼容 spring-framework;可避免源码泄漏或字节码被反编译。加密后,原始的 class 文件中方法体被清空,当 class 被 classloader 加载时,真正的方法体会被解密注入。为兼容 spring,swagger 等扫描注解的框架,故而保留了方法参数、注解等信息;反编译者只能看到方法名和注解;原创 2024-10-07 15:36:38 · 582 阅读 · 0 评论 -
Spring Boot 多线程事务管理:使用 CyclicBarrier 和 PlatformTransactionManager 实现全局事务控制
通过本文介绍的多线程事务处理工具类,我们可以轻松地在多线程环境下控制事务的提交与回滚。特别是在多个线程同时操作数据库时,如果其中一个线程失败,如何保证其他线程的事务操作也能一并回滚,而不是部分提交,成为了开发者必须考虑的重点。在默认情况下,Spring 的事务是线程不安全的,即每个线程都有自己独立的事务上下文。为了在多线程环境下保证事务的统一提交或回滚,我们需要一种机制,能够在所有线程完成操作后,再决定是否提交事务。如果某个线程的任务失败,整个事务应当回滚,确保所有线程的任务要么一起成功,要么一起失败。原创 2024-09-24 23:19:13 · 475 阅读 · 0 评论 -
InheritableThreadLocal vs TransmittableThreadLocal 深入理解与使用场景
即使线程池复用了子线程,它仍然能获取到正确的值。TransmittableThreadLocal 的原理是:每次任务提交时,它会把父线程的 ThreadLocal 值传递给子线程(无论子线程是新建的还是复用的)。则适用于更加复杂的场景,尤其是当我们使用线程池时,希望父线程的上下文信息(例如用户信息、事务ID等)能够传递给子线程,无论子线程是新建的还是复用的。适用于一些简单的场景,比如普通的多线程编程中,父线程需要将 ThreadLocal 值传递给子线程,且子线程不需要在线程生命周期中更新值的场景。原创 2024-09-12 18:31:22 · 251 阅读 · 0 评论 -
日常开发踩坑
【代码】日常开发坑记录。原创 2024-06-03 15:00:33 · 179 阅读 · 0 评论 -
使用docker安装向量数据库milvus
向量数据库是一种特殊的数据库,它以多维向量的形式保存信息。根据数据的复杂性和细节,每个向量的维数变化很大,从几个到几千个不等。这些数据可能包括文本、图像、音频和视频,使用各种过程(如机器学习模型、词嵌入或特征提取技术)将其转换为向量。矢量数据库的主要优点是它能够根据数据的矢量接近度或相似性快速准确地定位和检索数据。这允许基于语义或上下文相关性的搜索,而不是像传统数据库那样仅仅依赖于精确匹配或设置标准。推荐系统:向量数据库可以用于存储用户和物品的特征向量,以便实现个性化推荐。原创 2024-05-11 23:18:01 · 744 阅读 · 0 评论 -
Linux CPU 占用率 100% 排查五步法
Linux 服务器 CPU 占用率达到 100% 且一直居高不下,严重影响业务系统的正常使用,这时候领导让你来排查问题原因,如果不知道该如何下手,就有点尴尬了。当然,除了使用上面的基础方法外,还有很多工具可以直接使用,例如阿里的 Arthas。原创 2023-06-28 12:25:43 · 11286 阅读 · 0 评论 -
SpEL解析对象属性、Map
【代码】SpEL解析对象属性、Map。原创 2023-06-27 13:59:36 · 962 阅读 · 0 评论 -
docker 运行xxl-job-admin
xxl-job-admin 使用docker打包部署原创 2023-04-28 17:23:57 · 459 阅读 · 0 评论 -
springboot中手动管理事务(编程式事务)
【代码】springboot中手动管理事务(编程式事务)原创 2023-03-27 15:19:03 · 1811 阅读 · 0 评论 -
@ConditionalOnProperty使用
Spring boot 中有时候需要控制配置是否生效,使用 @ConditionalOnProperty 注解来控制 @Bean 是否生效。prefix : 是配置前缀,可有可无。name : 是配置名称。完整名称或部分名称,与 prefix 配合使用,与 value 不可同时使用。havingValue : 对比值,与name组合使用,该值与配置中值相同,则配置生效,不相同则配置不生效。matchIfMissing : 缺省值,缺少配置时,是否可以加载。原创 2022-10-18 11:06:54 · 1167 阅读 · 0 评论 -
红黑树和二叉树有什么区别
红黑树和二叉树有什么区别?什么是二叉树?什么是红黑树?二叉树(Binary Tree)是指每个节点最多只有两个分支的树结构,即不存在分支大于 2 的节点,二叉树的数据结构如下图所示这是一棵拥有 6 个节点深度为 2(深度从 0 开始),并且根节点为 3 的二叉树二叉树有两个分支通常被称作 “左子树” 和 “右子树”,而且这些分支具有左右次序不能随意地颠倒一棵空树或者满足以下性质的二叉树被称之为二叉查找树若任意节点的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;若任意节点的转载 2022-03-29 19:51:11 · 764 阅读 · 0 评论 -
保证分布式下quartz不重复执行
1. Redis 锁【基于内存、基于数据库均可】 public boolean getLock(String lockId, long millisecond) { Boolean success = redisTemplate.opsForValue().setIfAbsent(lockId, "lock", millisecond, TimeUnit.MILLISECONDS); return success != null && success; }publi原创 2022-02-27 18:47:23 · 1115 阅读 · 0 评论 -
JAVA 8 :从永久区(PermGen)到元空间(Metaspace)
本文由 简悦 SimpRead 转码, 原文地址 blog.youkuaiyun.com本文系翻译:原文 地址你注意到了吗? JDK 8 早期可访问版本已经提供下载了,java 开发人员可以使用 java 8 提供的新的语言和运行特性来做一些实验。其中一个特性就是完全的移除永久代(Permanent Generation (PermGen)),这从 JDK 7 开始 Oracle 就开始行动了,比如:本地化的 String 从 JDK 7 开始就被移除了永久代(Permanent Generation )。JD.转载 2022-02-21 00:56:00 · 1436 阅读 · 0 评论 -
类加载机制之双亲委派
JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的类加载器是一个重要的 Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。由于 Java 的跨平台性,经过编译的 Java 源程序并不是一个可执行程序,而是一个或多个类文件。当 Java 程序需要使用某个类时,JVM 会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class 文件中的数据读入到内存中,通常是创建一个字节数组读入.class 文件,然后产生与所加载类对应的 C转载 2022-02-20 23:39:30 · 406 阅读 · 0 评论 -
chrome 并发请求数
一、先上结论:①同一域名下,同一 GET 请求的并发数是 1,也就是说上一个请求结束,才会执行下一个请求,否则置入队列等待发送;②同一域名下,不同 GET/POST 请求的并发数量是 6。当发送的请求数量达到 6 个,并且都没有得到响应时,后面的请求会置入队列等待发送。二、测试1、服务器端服务器端创建了一个 GET 请求的 serve 方法和一个 POST 请求的 serve 方法,方法内容都是保持方法执行时间≥3s。package com.example.demo.controller;转载 2022-02-18 12:00:22 · 2013 阅读 · 0 评论 -
future.get方法阻塞问题的解决,实现按照任务完成的先后顺序获取任务的结果
package com.cdn.mybatis_test.controller;import lombok.SneakyThrows;import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/**原创 2021-12-19 18:59:55 · 787 阅读 · 0 评论 -
Spring Boot+SQL_JPA 实战悲观锁和乐观锁
原文链接:https://zzzzbw.cn/article/18最近在公司的业务上遇到了并发的问题,并且还是很常见的并发问题,公司业务就是最常见的 “订单 + 账户” 问题, 算是低级的失误了。由于公司业务相对比较复杂且不适合公开,在此用一个很常见的业务来还原一下场景,同时介绍悲观锁和乐观锁是如何解决这类并发问题的。业务还原首先环境是:Spring Boot 2.1.0 + data-jpa + mysql + lombok数据库设计对于一个有评论功能的博客系统来说,通常会有两个表:1. 文.转载 2021-12-19 01:32:27 · 968 阅读 · 0 评论 -
HashMap 解决 hash 冲突
HashMap 采用一种所谓的 “Hash 算法” 来决定每个元素的存储位置。当程序执行 map.put(String,Obect)方法 时,系统将调用 key的String 的 hashCode() 方法得到其 hashCode 值——每个 Java 对象都有 hashCode() 方法,都可通过该方法获得它的 hashCode 值。得到这个对象的 hashCode 值之后,系统会根据该 hashCode 值来决定该元素的存储位置。存储过程:判断当前确定的索引位置是否存在相同 hashcode 和转载 2021-12-13 12:48:01 · 897 阅读 · 0 评论 -
synchronized 方法锁、对象锁、类锁区别
不加锁的情况package com.example.demo.controller;import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class AdminController { public static void m..原创 2021-11-11 23:42:31 · 433 阅读 · 1 评论 -
Springboot 中统一修改响应头两种方式
Springboot 中统一修改响应头两种方式方式一 :(AOP )package com.cdn.test.ad;/** * @author CaiDingNu * @desc * @date 2021/10/02 21:54 */import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect原创 2021-10-02 22:12:56 · 3606 阅读 · 1 评论 -
Springboot 中动态定义 Bean
bean 定义的方法很多,在所有定义bean的方法中控制即可,本文只是以注解的方式举列,此处的目标Bean为拦截器,也可以实现对拦截器的开关,可以使用注解来控制Bean的创建,或者定义一个变量控制定义Bean 的 方式一、 目录EnableBean.javapackage com.cdn.mul.annotation;import com.cdn.mul.config.Test1;import com.cdn.mul.config.Test2;import com.cdn.mul.co原创 2021-09-12 17:29:20 · 619 阅读 · 0 评论 -
quartz整合springboot
依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <dependency> <groupId>org.spri原创 2021-08-01 00:19:09 · 181 阅读 · 0 评论 -
springboot 项目启动之后执行方法的三种方式
@Componentpublic class Run implements ApplicationRunner, CommandLineRunner{ @Override public void run(ApplicationArguments args) throws Exception { System.out.println("服务启动RunnerTest ApplicationRunner执行启动加载任务..."); } @Overrid.原创 2021-01-13 20:17:46 · 3190 阅读 · 0 评论 -
springboot+Knif4j 部分配置
本文配置适用于2.X一、pom <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>2.0.8</version> </depende原创 2021-01-12 22:44:42 · 440 阅读 · 0 评论 -
spring根据bean的名称获取对象,并调用方法
一、工具@Componentpublic class SpringContextUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext){ Spri.原创 2021-01-06 17:53:05 · 3457 阅读 · 0 评论 -
SpringBoot 声明式事务失效场景
如果声明事务的方法不是public,事务会失效 同一个类中一个没有事务的方法,调用一个有事务的方法时,事务失效 异常被trycatch 捕获,事务失效 数据库引擎要支持事务,mysql数据库,必须设置数据库引擎为InnoDB。 springboot是否开始事务管理,@EnableTransactionManagement(默认开启) 异常类型配置错误 业务和spring事务代码必须在一个线程中 事务传播属性设置错误 Propagati...原创 2020-12-31 15:02:22 · 1450 阅读 · 1 评论 -
通过反射获取类中的所有属性与方法
获取公共属性 //可以随意用四种类加载方式的任意一种获取类对象 实体类 s=new 实体类(); Class c=s.getClass(); //通过类对象获取单个属性 Field f=c.getFiled("属性名");//f为当前指定类属性的file属性 //给对象属性赋值 f.set(s,"值"); //获取属性值 f.get(s); 获取私有属性 实体类 s=new 实体类(); Class c=s.getClass(); Field f=c.getDeclar原创 2020-12-06 23:23:34 · 519 阅读 · 0 评论 -
多线程操作一个变量
package practlce;/** * desc: * author CDN * create 2019-07-23 22:44 * version 1.0.0 */public class TextThread { public static void main(String[] args) { TxtThread2 txtThread2...原创 2019-07-23 23:37:10 · 548 阅读 · 0 评论 -
Java Socket实现文件传输
客户端设计思路:客户端与服务端建立连接,选择客户端本地文件,先将文件名及大小等属性发送给服务端,再将文件通过流的方式传输给服务端。传输的进度打印到控制台中,直到传输完成。服务端设计思路:服务端接收客户端的请求(阻塞式),每接收到一个客户端请求连接后,就新开一个处理文件的线程,开始写入流,将文件到服务器的指定目录下,并与传输过来的文件同名。下面是客户端和服务端的代码实现:客户端代码:...原创 2019-06-08 15:26:37 · 18493 阅读 · 11 评论