Java
文章平均质量分 86
Java
zzhongcy
因为站在了巨人的肩上,所以我看得更远。
当你发现自己的才华撑不起野心时,就请安静下来学习吧
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
SpringAOP+Logback+MDC实现traceId全链路日志追踪
MDC(Mapped Diagnostic Context,映射诊断上下文)是 SLF4J 提供的一种上下文机制,它允许在日志记录时附加一些关键的上下文信息(如traceIduserId等),这些信息可以在日志格式中被引用,从而丰富日志内容,便于后续的日志分析和追踪。@Override// 此时获取的是父线程的上下文数据try {if (!// 清除子线程的,避免内存溢出,就和ThreadLocal.remove()一个原因//配置核心线程数//配置最大线程数。原创 2026-07-17 20:15:00 · 210 阅读 · 0 评论 -
parallelStream的陷阱
对于 Java 语言来说,生来就支持多线程并发编程,在并发编程领域也是在不断发展的。Java 在其发展过程中对并发编程的支持越来越完善也正好印证了这一点。Java 1 支持 thread,synchronized。Java 5 引入了 thread pools, blocking queues, concurrent collections,locks, condition queues。Java 7 加入了 fork-join 库。Java 8 加入了 parallel streams。原创 2026-07-15 15:55:09 · 211 阅读 · 0 评论 -
SpringBoot 滑块拼图验证
在 SpringBoot 中实现滑块拼图验证,首选主流开源组件(行为验证码) 或TgQPHd||[]。核心逻辑为:后端随机抠图生成带有缺口的背景图与滑块图,将目标距离存入 Redis 并附带轨迹校验。原创 2026-07-14 15:02:05 · 232 阅读 · 0 评论 -
Java 21结构化并发StructuredTaskScope 和 ThreadForge 讲解
Java 21 引入的结构化并发(Structured Concurrency)是对传统并发编程模型的重大改进。它通过明确的任务生命周期管理和作用域控制,解决了长期以来困扰开发者的线程泄漏、任务状态难以追踪等问题。统一并发模型:将虚拟线程、平台线程、异步任务等统一到结构化作用域中。增强可观测性:提供任务之间的父子关系和依赖管理。简化资源管理:确保任务失败时资源的正确释放。提高代码安全性:避免隐式线程泄漏和不可控的并发行为。原创 2026-07-14 14:44:28 · 194 阅读 · 0 评论 -
@Transactional 同类内部调用失效 + 两种自代理解决方案
优先:自注入 self,代码整洁、可读性好、无配置依赖;备选:AopContext,不想多一个成员变量时使用,必须开启。原创 2026-06-03 10:23:55 · 248 阅读 · 0 评论 -
多级缓存对比(Caffeine + Redis),以及缓存不一致问题的解决
而 Spring Cache 的强大之处,还体现在它对多种缓存实现的支持,其中 Caffeine 和 Redis 无疑是备受瞩目的两种方案。真实的业务工程中,建议使用Caffeine作为本地缓存,另外使用redis或者memcache作为分布式缓存,构造多级缓存体系,保证性能和可靠性。可以使用MQ的广播模式,当数据修改时向MQ发送消息,节点监听并消费消息,删除本地缓存,达到最终一致性;两级缓存与数据库的数据要保持一致,一旦数据发生了修改,在修改数据库的同时,本地缓存、远程缓存应该同步更新。原创 2026-01-04 20:27:00 · 899 阅读 · 0 评论 -
Java: HashMap 和 ConcurrentHashMap的区别
分段锁(Segmented Locking)是一种用于提高多线程程序性能的锁机制,通过将锁细分来减少竞争,从而在高并发环境中提高性能。分段锁在Java的中有广泛应用。安全性:ConcurrentHashMap 在多线程环境下是安全的,而HashMap 不是。使用场景:如果是单线程环境,使用HashMap 更优;如果是多线程环境,且需要高性能的线程安全Map,则应选择ConcurrentHashMap。。原创 2025-12-03 21:03:32 · 828 阅读 · 0 评论 -
JDK各个版本详解
来,直接传送门:原创 2025-10-20 21:08:16 · 279 阅读 · 0 评论 -
Springboot6种解决循环依赖方案
本文梳理了解决循环依赖的几种方法。大体分三类:配置解决,延后注入使用和解耦调用关系。如果出现了循环依赖,大体是设计有点问题,是软件开发中的坏味道,如果暂时无法从架构层面解决,那可以根据场景选择适合的方案。转载 2025-10-20 21:06:54 · 274 阅读 · 0 评论 -
双token
顾名思义,本机制下所使用的令牌分为长短两种:长令牌即过期时间较长的,专门用于token的续签,同时刷新两种token;短令牌即过期时间较短的access_token,进行常规业务请求时使用。登陆用户登录成功后,同时获得长短两种令牌,之后长令牌存在客户端暂不使用,仅使用短令牌用于常规业务请求。服务端在接收到每个携带短令牌的业务请求时,按照JWT的规则进行用户的身份验证,并从payload中获取用户身份信息,此即“三验证”中的第一种验证。原创 2025-09-10 21:28:24 · 814 阅读 · 0 评论 -
Netty 底层零拷贝
Netty 的零拷贝技术是通过优化数据传输过程中的数据复制操作,以降低系统的开销和提高性能。通过以上方式,Netty 实现了数据传输过程中的零拷贝,大大提高了系统的性能和吞吐量,特别是在高并发、大数据量的网络应用场景下,可以显著地降低系统的资源消耗和延迟。转载 2025-08-28 21:43:58 · 145 阅读 · 0 评论 -
Spring Boot对访问密钥加解密——HMAC-SHA256
HMAC-SHA256 是一种基于 哈希函数 的消息认证码(Message Authentication Code, MAC),它结合了哈希算法(如 SHA-256)和一个密钥,用于验证消息的完整性和真实性。HMAC 是 “Hash-based Message Authentication Code” 的缩写,它广泛应用于网络通信中,用于保证消息在传输过程中未被篡改,同时也可以校验消息是否来自可信方。原创 2025-08-28 21:39:13 · 1927 阅读 · 0 评论 -
主流配置中心对比
在单体应用中,配置管理可能不是什么大的事情,通常会以配置文件的方式。常见的方法比如将配置通过打包脚本打入应用包中,或者直接放到运行应用的服务器的特定目录下,或者存储到数据库中。配置变化频繁时,需要频繁的打包部署应用。不同环境的配置需要分开管理(比如测试环境与生产环境)。而在分布式微服务架构中,服务数量剧增,如果还是手动去实现配置信息的修改或数据的迁移等,效率是很低的,而且手动操作配置也极有可能出现错误的情况。原创 2025-08-27 21:51:28 · 1157 阅读 · 0 评论 -
Sprintboot 添加banner
在日常开发中,我们经常会看到各种各样的启动画面。例如以下几种①spring项目启动画面②启动画面③若依项目启动画面还有很多各式各样好看的启动画面,那么怎么定制这些启动画面呢?转载 2025-08-13 14:06:56 · 252 阅读 · 0 评论 -
restTemplate禁用url编码
在将queryUrl传入RestTemplate之前,将其封装为一个URL对象,避免了queryUrl被RestTemplate进行2次UrlDecode。param={"name":"张三","age":22}我们想要的结果并不想restTemplate调用的时候二次编码,而是使用我们的url。param={"name":"张三","age":22}在restTemplate调用方法的时候默认对url做了编码处理。这时使用restTemplate调用接口,会对url再次编码成。接口放接收到路径解码后。原创 2025-08-07 13:39:19 · 559 阅读 · 0 评论 -
SpringBoot设置跨域的几种方式
来源是URL的结构是这样的,在这个URL的组成部分中,Origin是指协议、主机和端口号的组合,例如:80、443。CORS 的出现是因为来源不同。也就是说,必须遵守 SOP。-> 这意味着该政策只允许相同的来源。过去,出于安全考虑,严格只允许来自同一来源的通信,但最近,从不同来源获取和使用资源变得非常普遍,因此创建了作为 SOP 例外的 CORS 策略。当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域首先编写一个过滤器,可以起名字为MyCorsFilter.java。原创 2025-08-06 15:12:20 · 930 阅读 · 0 评论 -
Spring Boot 3.5.x 使用 SpringDoc 2 / Swagger3
Springfox 是一套可以帮助 Java 开发者自动生成 API 文档的工具,它是基于 Swagger 2.x 基础上开发的。除了集成 Swagger 2.x,Springfox 还提供了一些额外功能,例如自定义 Swagger 文档、API 版本控制、请求验证等等。但是随着时间的推移,Swagger2.x 终究成为历史,所以我们可以看出 springfox-boot-starter 的坐标从 3.0.0 版本(2020 年 7 月 14 日)开始就一直没有更新;原创 2025-07-29 16:36:46 · 2895 阅读 · 1 评论 -
Springboot集成knife4j
针对以上两种情况,Knife4j基于Servlet体系提供了过滤Filter功能,如果开发者使用Spring Boot开发框架进行开发的话,只需在。配置文件中配置相关属性即可方便的解决上面的问题,不用删除Springfox-swagger的jar包或者删除相关代码等复杂的操作,提升开发体验.功能时,同很多开发者经常讨论的问题就是在生产环境时,屏蔽或者去除Swagger的文档很麻烦。注解来使用增强功能,自2.0.6版本后,只需要在配置文件中配置。在以前的版本中,开发者需要在配置类中手动使用。原创 2025-07-18 13:55:46 · 1893 阅读 · 0 评论 -
Nexus
Nexus 的全称是 Nexus Repository Manager(Nexus 仓库管理器),是 Sonatype 公司的一个产品。Nexus 是一个强大的仓库管理器,极大地简化了内部仓库的维护和外部仓库的访问。Nexus 分为开源版和专业版,其中开源版足以满足大部分 Maven 用户的需求。原创 2025-03-10 14:25:36 · 922 阅读 · 0 评论 -
Quartz 调度框架介绍
Quartz转载 2024-08-06 17:31:17 · 1367 阅读 · 0 评论 -
AES解密报错Invalid AES key length: xx bytes与Given final block not properly padded的解决方法
最近和其它系统联调接口,用到了Java的AES加解密。由其它系统AES加密,本人的系统获取到加密报文后,AES解密,获取到内容。本来是比较简单的,可是其它系统只提供了秘钥,没有提供解密方法,解密方法需要我们自己写……正常应该是加密方提供解密方法的吧,我觉得……还好最后都解决了,在此记录下。转载 2024-07-25 18:03:27 · 3979 阅读 · 0 评论 -
mybatis报错:Error querying database. Cause: java.lang.NumberFormatException: For input string: xx
'Y',此时,mybatis认为拿一个字符串(String)和一个字符(char)比较,也会报错。参数格式化异常导致,例如在动态sql拼接中String类型参数和数字比较。2. 改为双引号"2",外层使用单引号。3. 加转义实体字符串引号。转载 2024-06-14 16:53:38 · 961 阅读 · 0 评论 -
mybatis 跨库查询 mysql
跨库,表关联的查询,实现起来很简单:selecta.uidfrom只要在表的前边加上库名即可。原创 2024-05-11 11:00:05 · 1608 阅读 · 0 评论 -
Mybatis 批量插入数据 SQL
上面代码中在 SQL 语句的最外层使用了 for 循环,好处是将 List 类型的集合传递来写入数据时可以有的是新增有的是修改,例如3行数据,第一三行由于主键字段对应属性 sid 被设置为 NULL ,会向数据库中新增行,第二行数据设置了 sid ,并且该值在数据库中有对应行,那么会修改数据库中的该行上的数据。通过在 java 中测试,发现上面的语句新增一行成功后会返回1,修改成功后会返回2(这里有疑惑,如果清楚原因的麻烦跟帖科普下)。这种写法适合插入数据的项不变,原创 2024-02-02 11:11:45 · 4615 阅读 · 0 评论 -
mybatis&Mysql分页查询,以及SQL_CALC_FOUND_ROWS与count(*) 性能对比
温故而知新,这里记录一下。原创 2024-01-11 17:48:18 · 1864 阅读 · 0 评论 -
Redis实战之Redisson使用技巧详解
什么是 Redisson?来自于官网上的描述内容如下!Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端(In-Memory Data Grid)。它不仅提供了一系列的 redis 常用数据结构命令服务,还提供了许多分布式服务,例如分布式锁、分布式对象、分布式集合、分布式远程服务、分布式调度任务服务等等。相比于 Jedis、Lettuce 等基于 redis 命令封装的客户端,Redisson 提供的功能更加高端和抽象,逼格高!转载 2023-12-07 19:13:39 · 2902 阅读 · 1 评论 -
WebMvcConfigurer配置详解
WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。基于java-based方式的spring mvc配置,需要创建一个类并实现接口;在Spring Boot 1.5版本都是靠重写的方法来添加自定义拦截器,消息转换器等。原创 2023-11-14 10:17:42 · 2909 阅读 · 0 评论 -
SpringBoot项目中ModelMapper配置以及使用
项目中对象与对象赋值转换使用的频率非常的高,比如数据库表实体对象(Entity)与业务类对象(Model)之间的赋值传递,或者模型对象(Model)与视图对象(ViewModel)之间的赋值传递。如果我们一个一个字段的赋值,将是非常繁琐并且毫无价值的重复工作,此时虽然我们可以自己通过反射提取个公共的方法来处理,但是更高效的方式是查看是否有第三方已经提供了比较成熟稳定的工具包,避免重复造轮子的工作。原创 2023-11-13 16:06:32 · 1454 阅读 · 0 评论 -
Spring Data JPA方法名命名规则
简单条件查询:查询某一个实体类或者集合。按照Spring Data的规范的规定,查询方法以find | read | get开头(比如 find、findBy、read、readBy、get、getBy),涉及查询条件时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。原创 2023-11-13 11:29:29 · 4531 阅读 · 0 评论 -
Shiro的基础知识、回顾URL拦截
本文主要讲解的知识点有以下:权限管理的基础知识模型粗粒度和细粒度的概念回顾URL拦截的实现Shiro的介绍与简单入门只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。用户认证用户授权shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。转载 2023-10-13 15:59:56 · 698 阅读 · 0 评论 -
SpringBoot, EventListener事件监听的使用
1、事件(event)可以封装和传递监听器中要处理的参数,如对象或字符串,并作为监听器中监听的目标。2、监听器(listener)具体根据事件发生的业务处理模块,这里可以接收处理事件中封装的对象或字符串。3、事件发布者(publisher)事件发生的触发者。原创 2023-10-07 10:47:34 · 808 阅读 · 0 评论 -
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
大家在连接mysql的时候,启动项目,会警告你推荐使用com.mysql.cj.jdbc.Driver 而不是com.mysql.jdbc.Driver。当5之后的版本选择的时候,会有警告提示,替换为查看源码可知,老版本的Driver继承了新版本的Driver那么这两者到底有什么区别呢。转载 2023-07-27 14:51:29 · 2219 阅读 · 0 评论 -
Spring Boot 2.7.8以后mysql-connector-java与mysql-connector-j
如果升级到Spring Boot 2.7.8,可以看到因为找不到mysql-connector-java依赖而出现错误。原创 2023-07-27 14:23:42 · 14259 阅读 · 1 评论 -
Java获取 User-Agent介绍
根据获取访问设备信息。Http 协议请求头中的User-Agent属性会将客户端设备的信息传递给服务器,这些信息包括客户端操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。原创 2023-06-08 09:41:26 · 3960 阅读 · 0 评论 -
Spring AOP在项目中的典型应用场景
Spring AOP在项目中的典型应用场景_spring aop应用场景__江南一点雨的博客-CSDN博客原创 2023-06-05 13:38:33 · 603 阅读 · 0 评论 -
AbandonedConnectionCleanupThread$ConnectionFinalizerPhantomReference内存溢出
有些读者看到这里知道 mysql-connector-java 生成的虚引用对 GC 有一些副作用,但是还不太了解虚引用到底是什么,有什么作用,这里我们在虚引用上做一点点拓展。Java 虚引用(Phantom Reference)是Java中一种特殊的引用类型,它是最弱的一种引用。与其他引用不同,虚引用并不会影响对象的生命周期,也不会影响对象的垃圾回收。虚引用主要用于在对象被回收时收到系统通知,以便在回收时执行一些必要的清理工作。上述虚引用的定义还是比较难理解,我们用代码来辅助理解://虚引用队列。原创 2023-05-29 14:09:47 · 8098 阅读 · 1 评论 -
为什么JDK中String类的indexof不使用KMP或者Boyer-Moore等时间复杂度低的算法编辑器
indexOf原创 2023-01-18 14:37:25 · 2470 阅读 · 0 评论 -
提高kafka消费速度之从源码去了解Spring-kafka的concurrency参数
kafka原创 2023-01-13 16:38:40 · 7646 阅读 · 3 评论 -
JAVA踩坑之Arrays.asList().contains()
contains原创 2023-01-09 17:33:19 · 2943 阅读 · 1 评论 -
spring-data-redis中同时使用set()、get()、increment()的问题
redis原创 2022-12-28 17:14:29 · 2014 阅读 · 0 评论
分享