
JAVA
文章平均质量分 85
@程序员小袁
你说 然后呢 憋说话,让我静静
展开
-
JDK 17 vs JDK 21 如何选择?
在技术日新月异的今天,选择合适的Java版本]对项目成功至关重要。本文将从多个角度详细剖析 JDK 17 与 JDK 21 的核心特性和优势,助你在开发过程中做出更加明智的决策。无论你选择哪一版本,保持对 Java 生态系统中不断涌现的新特性的关注,都将为项目带来持续的技术红利。A:虽然作为 LTS 版本,JDK 21 保持了长期支持,但如果你追求最新的非 LTS 功能,则可能需要更频繁地关注更新动态。这一概念旨在通过清晰的任务层次结构减少并发编程中常见的错误,如线程泄漏和意外中断,增强代码健壮性。原创 2025-03-28 09:51:44 · 1036 阅读 · 0 评论 -
Spring Framework启动机制深度解析
通过深入分析refresh()方法的执行流程,我们可以清晰地看到Spring容器初始化的技术脉络。这种理解不仅有助于排查复杂问题,更能指导我们正确使用扩展点进行定制开发。后续我们将继续探讨SpringBoot如何在标准refresh流程基础上实现自动配置等增强特性。原创 2025-03-27 09:50:00 · 1000 阅读 · 0 评论 -
深度解析Spring Boot可执行JAR的构建与启动机制
传统Java应用的JAR包在依赖管理上存在明显短板,依赖项需要单独配置classpath。通过深入理解Spring Boot的打包机制和启动原理,开发者可以更好地优化应用架构设计,提升部署效率,并有效排查类加载相关的问题。原创 2025-03-27 09:49:37 · 591 阅读 · 0 评论 -
医院管理系统(源码)分享
随着计算机科学的迅猛发展和互联网技术的不断推进,人们的生活方式发生了巨大的变化,同时也推动了整个软件产业的发展。我国医院信息管理系统的发展形式十分令人鼓舞,无论是国家、医院还是软件公司,都投入了大量的人力、物力、财力。本课题根据前期的问卷调查以及实地考察,作出了适合实际的需求分析,采用了前后端分离的思想,后端使用了SpringBoot和SpringMVC框架,前端使用了Vue.js和ElementUI进行页面的搭建,并且使用了MySQL数据库进行数据交互。三者协同工作构建现代化、交互式的网页。原创 2025-03-26 21:40:27 · 636 阅读 · 0 评论 -
redisson分布式锁原理
但随着业务规模扩大,系统逐步转向分布式架构,传统的单机锁(如JUC锁)就显得不足,因为数据往往分布在多个节点上。但这种方案存在风险:如果在加锁后节点突然宕机,锁无法释放,导致后续其它节点无法加锁,形成死锁。如果在主节点成功加锁后,由于故障或宕机导致数据尚未同步到从节点,那么其他节点可能无法正确感知锁的状态,从而引发锁失效和并发安全问题。另外,如果业务处理时间超过锁的过期时间,锁会被提前释放,从而产生并发问题。因此,除了加锁和解锁的原子性,还需要在业务执行过程中对锁进行续期,确保业务完成前锁不会失效。原创 2025-03-26 11:47:46 · 777 阅读 · 0 评论 -
深入解析 RedissonMultiLock —— 分布式联锁的原理与实战
可以帮助我们同时锁定多个关键资源,只有所有子锁都成功后才执行后续操作,保证数据一致性。建议调用加锁方法前,根据实际情况设置合适的等待时间和租约时间,充分利用看门狗机制防止锁误释放;释放锁时最好判断当前线程是否持有该锁,以避免误解锁导致异常;应用场景:适用于分布式订单处理、跨服务协同操作和复杂事务控制等需要同时操作多个资源的场景。原创 2025-03-26 11:36:06 · 611 阅读 · 0 评论 -
基于Springboot的电影售票管理系统【附源码】
电影院售票系统(源码)」原创 2025-03-24 22:19:29 · 1951 阅读 · 2 评论 -
MyBatis-Flex、MyBatis-Plus 与 Fluent-Mybatis 的比较分析
MyBatis 是一个灵活且易于扩展的持久层框架。随着企业级项目需求的增长,传统 MyBatis 在面对 CRUD 操作、复杂查询时往往需要编写大量 XML 或注解代码。:以增强 MyBatis 的 CRUD 功能和语法糖著称,内置分页、代码生成、性能分析等功能。:在简化配置与开发的同时,更注重灵活性与扩展性,支持多种查询方式和动态 SQL 构造。:提供流式 API,让编写查询更加直观、优雅,降低了 SQL 编写的门槛。MyBatis-Flex 主要目标是减少冗余代码,提升开发效率。灵活配置。原创 2025-03-24 21:23:52 · 1088 阅读 · 0 评论 -
图书管理系统系统-Java、SpringBoot、Vue和MySQL开发的图书馆管理系统
「springboot、vue图书馆管理系统.zip」链接:https://pan.quark.cn/s/5a929a7e9450分享一个图书管理系统,Java、SpringBoot、Vue和MySQL开发的图书馆管理系统以下是对文本内容的总结:项目概述项目名称与背景:项目概述系统架构与技术栈主要功能模块系统设计与实现项目意义与总结整体来说,该图书馆管理系统为图书馆管理提供了一种全新的、稳定且高效的信息化解决方案,并具有良好的推广应用前景。在整理总结时,我提取了文档中各章节的核心内容,包括项目背景、技术选原创 2025-03-23 22:22:38 · 809 阅读 · 0 评论 -
JDK 24 发布,新特性解读!
作为继Java 21之后的第三个非LTS版本,其技术革新力度远超预期——共集成24项JEP提案,相当于Java 22(12项)与Java 23(12项)的总和。值得关注的是,本次更新不仅包含语言层面的改进,更在密码学安全、运行时性能、并发模型等关键领域实现重大突破。随着量子计算与云原生架构的快速发展,Java 24在安全体系、运行时性能、开发者体验等方面的创新,为现代应用开发提供了更强大的基础支撑。建议开发者重点关注密钥派生API、类文件处理标准化等特性,这些改进将深刻影响未来三年的Java技术演进方向。原创 2025-03-21 13:49:46 · 889 阅读 · 0 评论 -
Java多进程多线程处理详解
多进程多进程是指操作系统中同时运行多个独立的进程。每个进程都有自己独立的内存空间和系统资源,进程间通过进程间通信(IPC)进行交互。多进程适用于需要高隔离性、高稳定性的应用场景,如服务器中的多个独立服务。多线程多线程是指在一个进程内同时运行多个线程。线程是进程的一部分,共享进程的资源(如内存和文件句柄),线程间通信相对容易且高效。多线程适用于需要共享资源且需要高并发的应用场景,如GUI应用、网络服务器等。原创 2025-02-27 23:02:37 · 420 阅读 · 0 评论 -
Spring Boot 3.4 中 MockMvcTester 的新特性解析
提供的流畅断言,控制器测试的可读性和可维护性均得到了显著提升。如果你正在使用 Spring Boot 进行测试,不妨尝试。的实际应用,我们首先创建一个基础的 Spring MVC 控制器,提供一个。在 Spring Boot 3.4 版本中,引入了一个全新的。被自动配置并提供了流畅的 API,使我们能够直接使用。通常情况下,Spring 开发者在测试中选择。从 Spring Boot 3.4 开始,方法中,提升测试的可读性和可维护性。测试并提升测试的可读性。测试中,我们必须使用。测试的增强,使得偏好。原创 2025-02-08 18:01:14 · 592 阅读 · 0 评论 -
Java 21 虚拟线程详解
虚拟线程内存占用低:无需为每个虚拟线程分配一个独立的操作系统线程,降低了系统资源消耗。高效上下文切换:由 JVM 内部调度管理,不涉及昂贵的 OS 级别线程切换,能更好地应对高并发场景。简而言之,虚拟线程可看作是“任务(Task)”,它们运行在传统的操作系统线程之上,但在代码层面与常规线程使用方式完全一致。为了避免因无限制并发导致 OOM 或对下游系统产生巨大压力,可借助信号量(Semaphore)和阻塞队列实现自定义虚拟线程池。/*** 构造函数。原创 2025-02-07 15:36:31 · 1352 阅读 · 0 评论 -
SpringBoot 实现图片防盗链功能
简单写死配置的方式,直接在拦截器中判断 Referer;基于配置文件灵活配置的方式,通过配置防盗链参数,并在拦截器中使用。虽然这种方法能对一般情况下的盗链行为起到一定防护作用,但考虑到 Referer 可伪造等问题,实际项目中还需根据具体场景综合考虑更全面的安全策略。原创 2025-02-05 11:47:17 · 449 阅读 · 0 评论 -
滑动窗口限流算法:基于Redis有序集合的实现与优化
/ 窗口大小(默认:60秒) long threshold() default 3;// 阈值(默认:3次) }// 窗口大小(默认:60秒) long threshold() default 3;// 阈值(默认:3次) }// 窗口大小(默认:60秒)// 阈值(默认:3次)通过Redis有序集合和Lua脚本,我们实现了一个高效且灵活的滑动窗口限流算法。结合AOP,我们可以轻松地将限流策略应用到具体的业务方法中。对于更复杂的流量控制需求,可以参考阿里巴巴的Sentinel框架。原创 2025-01-09 21:51:33 · 1217 阅读 · 0 评论 -
深入理解Spring中的发布订阅模式:原理、实现与应用场景
Spring框架通过发布订阅模式为组件间通信提供了高效且松散耦合的解决方案,提升了系统的灵活性和扩展性。本文将探讨该模式的原理、实现、应用场景及其优势与挑战。定义事件类,事件类通常继承自我们可以定义一个类来表示用户注册成功的事件// 这里的User是一个包含用户相关信息的实体类// source:事件的源对象,用于表明这个事件是由哪个对象触发的Spring的发布-订阅模式通过和等组件,解耦了消息的生产者和消费者,并支持异步通信。这样可以让不同模块独立处理事件,提升系统的灵活性、可扩展性和响应速度。原创 2025-01-09 21:51:01 · 734 阅读 · 0 评论 -
MyBatis-Plus实现MySQL和Starrocks多数据源整合
项目中有需求要同时使用MySQL和Starrocks,正好整理一下,文末有完整代码包。原创 2024-10-26 19:09:11 · 1390 阅读 · 0 评论 -
国内Maven仓库镜像地址汇总及配置
打开 maven 的配置文件( windows 机器一般在 maven 安装目录的 conf/settings.xml ),在。标签中添加 mirror 子节点,例如。中添加repository子节点,例如。(偶尔需要人机验证,不推荐)Maven仓库示意图。原创 2024-10-24 09:39:41 · 13522 阅读 · 0 评论 -
Java LocalDateTime:日期处理新纪元
然而,令人遗憾的是,在 Java LTS 版本已经发展到 21 的今天,Java 8 引入的这些日期时间类却仍未被大多数开发者熟练掌握。在软件开发的征程中,项目的推进往往如一艘破浪前行的巨轮,然而,一个看似微不足道的日期处理任务,却可能引发一场意想不到的“完美风暴”。的时间信息完美结合,提供了一种不含时区信息的日期时间表示方式,特别适用于那些只需关注本地日期和时间,而无需考虑时区差异的场景。它们分别负责处理无时间的日期和无日期的时间信息,以其简洁而强大的设计,解决了众多日期时间处理中的难题。原创 2024-10-23 10:11:18 · 701 阅读 · 0 评论 -
征服ES(ElasticSearch)的慢查询实战
在 Elasticsearch(ES)中,进行大数据查询时,常常会由于多种因素而导致性能显著下降。接下来,我们将深入探讨几种常见情况及其相应的解决方案。原创 2024-10-18 21:53:37 · 763 阅读 · 0 评论 -
轻松实现 API 接口限流:Bucket4j 在 Spring Boot 中的应用
例如,对于一个速率限制为每分钟 100 个请求的应用程序接口,我们可以创建一个容量为 100 的水桶,每分钟填充 100 个令牌。如果在一分钟内收到 70 个请求,少于可用令牌的数量,那么在下一分钟开始时,我们只需再添加 30 个令牌,就能使水桶达到容量。另一方面,如果在 40 秒内用完了所有令牌,我们将等待 20 秒来重新装满令牌桶。在请求消耗令牌的同时,我们也在以某种固定的速度补充令牌。它基于令牌桶算法,提供了强大的限流功能,既可用于独立的 JVM 应用程序,也可用于集群环境。原创 2024-10-18 21:52:42 · 1405 阅读 · 0 评论 -
Git不要只会pull和push,搞上5个提升效率的命令!
今日,为大家带来五个能让你从 Git 菜鸟迅速晋级为老鸟的高效命令,助你在编程之路上如鱼得水。在编程过程中,常常会遇到这样的情况:写了一半的代码,突然领导要求紧急修复一个 bug,而此时手上的改动又不能立即提交。当在开发分支上完成了一个出色的功能,想要快速应用到主分支上展示时,cherry-pick 命令就是最佳选择,它可以将指定的 commit 应用到当前分支。提交代码后,若发现存在问题或不该提交某些内容,软回溯命令就能发挥作用,将 commit 回滚同时保留修改。revert 命令就是你的得力助手。原创 2024-10-18 21:49:37 · 962 阅读 · 0 评论 -
JDK 21更新:switch语句的类型模式匹配与守卫模式
JDK 21中的switch语句和表达式的增强,使得Java语言在处理复杂条件和类型检查方面更加灵活和强大。类型模式匹配、守卫模式、模式匹配的switch表达式、改进的类型推断以及增强的错误检测能力,使得代码更加简洁、易读和易于维护。这些改进不仅提高了开发效率,还为开发者提供了更强大的工具来编写更加可靠和可维护的代码。原创 2024-10-17 21:25:03 · 650 阅读 · 0 评论 -
class 文件分析
Java 是跨平台的,JVM 作为中间层,自然要针对不同的操作系统提供不同的实现。通过不同操作系统的 JVM,源代码就可以不用根据不同的操作系统编译成不同的二进制可执行文件了,跨平台的目标也就实现了。那这个 class 文件到底是什么玩意呢?它是怎么被 JVM 识别的呢?编写一段简单的 Java 代码,文件名为 Hello.java。点击编译按钮后,IDEA 会自动生成一个名为 Hello.class 的文件,在的对应包目录下。原创 2024-10-10 09:20:37 · 746 阅读 · 0 评论 -
Java 8 的内存结构
由于java是一门高级语言,离硬件底层比较远,有时候无法操作底层的资源,于是,java添加了native关键字,被native关键字修饰的方法可以用其他语言重写,这样,就可以写一个本地方法,然后用C语言重写,这样来操作底层资源。当然,使用了native方法会导致系统的可移植性不高,这是需要注意的。int a=1;//这个1便是字面量//iloveu便是字面量。原创 2024-10-10 09:19:37 · 677 阅读 · 0 评论 -
小巧简单的JAVA字节码开源编辑器
jclasslib,可以理解他是一个工具,用于查询已编译成JAVA类的各种文件的实际内容,也可以通过jclasslib直接进行这些类文件的编写,jclasslib自带一个库,可以方便用户快速读写编辑类文件。引入JAVA类后,可以看到其,一般信息、常量池、接口、字段、方法、属性,并且可以分别进行查阅。jclasslib 可以切换中文、英文、波兰文、德文,并且可以自动识别系统当前使用语言;jclasslib,同时可以支持linux、mac、windows、unix多个平台。原创 2024-10-09 09:10:15 · 236 阅读 · 0 评论 -
为什么用元空间替换永久代
首先需要明确的是,以下讨论的HotSpot虚拟机,其他类型的虚拟机,例如JRockit与J9等,压根就没有永久代的概念。因此,下面所说的“虚拟机”都是HotSpot版本的。要想理解这种变化的原因,需要先理解方法区、永久代与元空间的概念与之间的关系。原创 2024-10-09 09:09:41 · 1988 阅读 · 0 评论 -
Java 类加载的几个阶段
如果要查找类加载器,通过方法可以获取。从运行结果可以看到,当前的类加载器是,它的上一级是,再上一级是null。其实的上一级是有类加载器的,它叫Bootstrap ClassLoader,是一个启动类加载器,由 C++ 实现,不是 ClassLoader 子类,因此以 null 作为结果返回。这几种类加载器的层次关系,可以用如下图来描述。在虚拟机启动后,会优先初始化Bootstrap Classloader。原创 2024-10-08 09:21:12 · 1195 阅读 · 0 评论 -
Java 类加载过程
开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。原创 2024-10-07 08:42:28 · 1085 阅读 · 0 评论 -
Java内存区域
Java内存区域。原创 2024-10-07 08:41:55 · 759 阅读 · 0 评论 -
JVM 内存布局
我们先来说堆。堆是 OOM 故障最主要的发生区域。它是内存区域中最大的一块区域,被所有线程共享,存储着几乎所有的实例对象、数组。所有的对象实例以及数组都要在堆上分配,但是随着 JIT 编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上也渐渐变得不是那么“绝对”了。Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC 堆”。从内存回收的角度来看,由于现在收集器基本都采用分代收集算法,所以 Java 堆中还可以细分为:新生代和老年代。原创 2024-10-07 08:41:26 · 1056 阅读 · 0 评论 -
Java类的生命周期浅析
简单一句话概括,类的加载阶段就是:找到需要加载的类并把类的信息加载到jvm的方法区中,然后在堆区中实例化一个java.lang.Class对象,作为方法区中这个类的信息的入口。那简单来说,java类被jvm进行加载到卸载的过程,就是java类的一生,称之为java类的生命的周期。jvm对类的加载时机没有明确规范,但对类的初始化时机有:只有当类被直接引用的时候,才会触发类的初始化。区别于对象的初始化,类的初始化所做的一起都是基于类变量或类语句的,也就是说执行的都是共性的抽象信息。类就是对象实例的抽象。原创 2024-10-06 12:39:52 · 835 阅读 · 0 评论 -
深入理解 Java 对象的内存布局
介绍了 Java 对象在 JVM 中的内存布局,整体可以分为:对象头、实例数据、对齐填充三个部分。第一部分的对象头包括了对象运行时数据和类型指针。其中对象运行时数据包括:哈希码、GC 分代年龄、锁状态标志等,类型指针指向对象类型元数据,确定对象是哪个类的实例。第二部分是实例数据,是真正存储的有效信息,包括各个类型的字段。第三部分是对齐填充,因为 JVM 要求对象起始地址必须是 8 字节的整数倍,所以必须有对齐填充来占位。原创 2024-10-06 11:15:36 · 819 阅读 · 0 评论 -
JVM 内存区域划分
在谈 JVM 内存区域划分之前,先来看一下 Java 程序的具体执行过程,画了一幅图。Java 源代码文件经过编译器编译后生成字节码文件,然后交给 JVM 的类加载器,加载完毕后,交给执行引擎执行。在整个执行的过程中,JVM 会用一块空间来存储程序执行期间需要用到的数据,这块空间一般被称为运行时数据区,也就是常说的 JVM 内存。所以,在谈 JVM 内存区域划分的时候,其实谈的就是这块空间——运行时数据区。了解官方出品的《Java 虚拟机规范》规范可以更方便地深入地理解 JVM。原创 2024-10-05 09:48:56 · 610 阅读 · 0 评论 -
6 个 Java 工具,轻松分析定位 JVM 问题
其中,S0 表示 Survivor0 区占用百分比,S1 表示 Survivor1 区占用百分比,E 表示 Eden 区占用百分比,O 表示老年代占用百分比,M 表示元数据区占用百分比,YGC 表示年轻代回收次数,YGCT 表示年轻代回收耗时,FGC 表示老年代回收次数,FGCT 表示老年代回收耗时。jstat 定时输出的特性,可以方便持续观察程序的各项指标。同样,如果没有条件使用图形界面(毕竟在 Linux 服务器上,主要使用命令行工具),又希望看到 GC 趋势的话,可以使用 jstat 工具。原创 2024-10-04 11:16:09 · 725 阅读 · 0 评论 -
如何在Spring Boot中有条件地运行CommandLineRunner Bean
PS 使用 Spring Boot 3.1.2 进行测试。原创 2024-10-04 11:15:42 · 457 阅读 · 0 评论 -
强大的JVM监控工具
在生产环境中,经常会遇到各种各样奇葩的性能问题,所以掌握最基本的JVM命令行监控工具还是很有必要的名称主要作用jps查看正在运行的Java进程jstack打印线程快照jmap导出堆内存映像文件jstat查看jvm统计信息jinfo实时查看和修改jvm配置参数jhat用于分析heapdump文件。原创 2024-10-03 08:29:32 · 1173 阅读 · 0 评论 -
Spring Boot 和 MyBatis-Plus凑一块儿了,这份教程你得看
通过以上步骤,我们完成了 Spring Boot 项目与 MyBatis-Plus 的集成。MyBatis-Plus 简化了大量繁琐的 CRUD 操作,提高了开发效率。通过结合 Spring Boot 的强大功能,我们可以更快速地构建高效、稳定的企业级应用。原创 2024-10-03 08:28:53 · 2116 阅读 · 1 评论 -
Java的栈帧和动态链接是什么?
在 Java 的面试过程中,不可避免的一个面试题那就是 JVM,而 JVM 的面试题中,有各种,比如在堆中会被问到的关于垃圾回收机制的相关问题,在栈中会被问到入栈以及出栈的过程,来聊一下关于栈的相关问题,比如,栈帧和动态链接指的是什么?总的来说,符号引用转为直接引用是Java类加载过程中解析阶段的一个重要步骤,它确保了符号引用能够被正确地解析为内存中的直接引用,从而实现Java程序的正常运行。:指向运行时常量池的方法引用,使得方法中的符号引用在运行时可以直接定位到引用的目标,比如某个类的成员或者方法。原创 2024-10-01 09:20:38 · 871 阅读 · 0 评论 -
new一个对象背后发生了什么?
Java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象的创建工作。先假设是第一次使用该类,这样的话new一个对象就可以分为两个过程:加载并初始化类和创建对象。原创 2024-09-30 09:11:25 · 1474 阅读 · 0 评论