
JAVA
文章平均质量分 85
@程序员小袁
你说 然后呢 憋说话,让我静静
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java 17 高效开发指南:新语法特性全面实战
摘要:JDK 17作为Java重要的LTS版本,集成了多项现代化语言特性。记录类简化了不可变对象的定义,密封类实现了类型安全的继承控制,模式匹配优化了类型转换流程,文本块改善了多行文本处理。此外,增强switch、var推断、接口私有方法等特性显著提升了代码简洁性和开发效率。这些改变使Java语言更符合现代开发需求,降低了模板代码量,增强了表达力和安全性。从语法到运行时性能,JDK 17标志着Java向现代化编程语言的转型。原创 2025-05-27 10:14:46 · 687 阅读 · 0 评论 -
别再乱用锁了!这9种Redisson锁的正确打开方式
Redisson提供了多种分布式锁类型,适用于不同业务场景。可重入锁适合普通并发控制,公平锁确保先到先得,联锁用于多资源操作,红锁提供高可用性,读写锁优化读多写少场景,信号量用于限流控制,可过期信号量防止资源泄漏,闭锁实现任务同步,自旋锁适合高频短操作。根据业务特性和性能需求选择合适的锁类型,如金融系统选用红锁,缓存场景选用读写锁。锁的组合使用需注意获取和释放顺序,避免死锁。合理选型既能保证系统可靠性,又能提升性能。原创 2025-05-27 10:07:40 · 642 阅读 · 0 评论 -
打造一个支持MySQL查询的MCP同步插件:Java实现
本文介绍了一个基于Java的MCP同步插件的实现,该插件通过JDBC操作本地MySQL数据库,并通过STDIO与上层MCP客户端(如Cursor)进行通信。插件注册了一个名为mysql的同步工具,接收连接参数和SQL查询,执行后将结果以JSON格式返回。文章详细描述了插件的目录结构、依赖配置(包括MCP核心SDK、MySQL JDBC驱动和Jackson JSON库)以及如何在Cursor中配置和使用该插件。通过命令行启动打包后的JAR文件,用户可以在对话中直接调用mysql工具执行任意查询并获取结果。原创 2025-05-21 23:16:19 · 1353 阅读 · 0 评论 -
从代码到智能:迈向 AI 驱动的 Java 开发新时代
AI技术在软件开发领域的应用日益广泛,涵盖了智能编码、代码质量与安全审查、测试自动化、性能调优以及项目管理与协作等多个方面。在智能编码领域,GitHub Copilot、Amazon CodeWhisperer、Tabnine、通义灵码、Trae和Cursor等工具通过AI模型提供代码补全、生成和优化功能,支持多种编程语言和IDE,并注重安全性和本地化体验。代码质量与安全审查方面,SonarLint AI、DeepCode、Codota和Jabel等工具通过静态分析和深度学习,帮助开发者发现并修复代码中的潜原创 2025-05-19 11:27:54 · 761 阅读 · 0 评论 -
Mac 环境下 JDK 版本切换全指南
在 macOS 上管理多个 JDK 版本时,可以使用系统自带的 /usr/libexec/java_home 工具。首先,通过执行 /usr/libexec/java_home -V 查询已安装的 JDK 版本及其路径。临时切换版本可以通过设置 JAVA_HOME 和 PATH 环境变量实现,而永久切换则需要将这些设置写入 shell 启动文件(如 ~/.zshrc 或 ~/.bash_profile)。此外,可以通过定义别名或使用 SDKMAN! 工具来简化版本切换过程。这些方法帮助用户在不同项目间灵活切原创 2025-05-15 20:52:15 · 2369 阅读 · 0 评论 -
为什么说不推荐使用Executors创建线程池?
尽管Executors工厂方法上手快,但其隐藏的无界队列、不可控的线程数、默认拒绝策略和线程工厂,在生产环境中极易埋下资源耗尽与排障难题。手动构造或Builder模式,显式配置核心参数;使用有界队列和自定义拒绝策略,防止系统过载;完善监控与可观测,快速定位瓶颈;关注虚拟线程,在合适场景下平滑迁移。如此,方能让线程池真正为业务保驾护航,而非“暗度陈仓”。原创 2025-04-30 09:34:57 · 510 阅读 · 0 评论 -
常用JVM参数(基于JDK1.8)
通过本文,我们了解了 JVM 内存分区的调控方法、不同垃圾收集器的选择及其调优参数,以及如何借助 GC 日志和异常转储文件进行问题分析。合理的 JVM 参数设置能有效降低 GC 停顿、减少内存碎片和避免系统宕机,从而保障 Java 应用在高并发、大流量场景下的平稳运行。调优过程中,建议始终以应用性能数据为依据,逐步调整并验证每一项改动的效果。原创 2025-04-30 09:33:31 · 983 阅读 · 0 评论 -
全面解析 Spring 依赖注入:@Autowired、@Inject 与 @Resource 深度剖析
在 Spring 框架中,依赖注入(Dependency Injection,简称 DI)是核心功能之一。通过不同的注解(如@Autowired@Inject@Resource),开发者可以以声明式方式将所需组件引入到业务代码中,解耦模块间的依赖关系。本文将从注解来源、默认注入行为,到底层处理流程以及多候选 Bean 的决策机制,全面剖析 Spring 容器如何解析并注入这些注解。原创 2025-04-25 13:55:32 · 912 阅读 · 0 评论 -
Spring Boot 集成Poi-tl实现动态Word文档生成
在项目开发过程中,遇到了一个需求:将用户输入的数据填充到给定格式的 Word 文档中。简单来说,就是要根据预定义的模板生成一个新的 Word 文档,并自动填充数据。官网:http://deepoove.com/poi-tl/poi-tl(Poi Template Language)是一个强大的 Word 模板引擎,能够根据 Word 模板和数据动态生成新的文档。底层是基于 Apache POI 实现的。原创 2025-04-20 15:58:48 · 1007 阅读 · 0 评论 -
JDK 17 vs JDK 21 如何选择?
在技术日新月异的今天,选择合适的Java版本]对项目成功至关重要。本文将从多个角度详细剖析 JDK 17 与 JDK 21 的核心特性和优势,助你在开发过程中做出更加明智的决策。无论你选择哪一版本,保持对 Java 生态系统中不断涌现的新特性的关注,都将为项目带来持续的技术红利。A:虽然作为 LTS 版本,JDK 21 保持了长期支持,但如果你追求最新的非 LTS 功能,则可能需要更频繁地关注更新动态。这一概念旨在通过清晰的任务层次结构减少并发编程中常见的错误,如线程泄漏和意外中断,增强代码健壮性。原创 2025-03-28 09:51:44 · 2325 阅读 · 0 评论 -
Spring Framework启动机制深度解析
通过深入分析refresh()方法的执行流程,我们可以清晰地看到Spring容器初始化的技术脉络。这种理解不仅有助于排查复杂问题,更能指导我们正确使用扩展点进行定制开发。后续我们将继续探讨SpringBoot如何在标准refresh流程基础上实现自动配置等增强特性。原创 2025-03-27 09:50:00 · 1066 阅读 · 0 评论 -
深度解析Spring Boot可执行JAR的构建与启动机制
传统Java应用的JAR包在依赖管理上存在明显短板,依赖项需要单独配置classpath。通过深入理解Spring Boot的打包机制和启动原理,开发者可以更好地优化应用架构设计,提升部署效率,并有效排查类加载相关的问题。原创 2025-03-27 09:49:37 · 709 阅读 · 0 评论 -
医院管理系统(源码)分享
随着计算机科学的迅猛发展和互联网技术的不断推进,人们的生活方式发生了巨大的变化,同时也推动了整个软件产业的发展。我国医院信息管理系统的发展形式十分令人鼓舞,无论是国家、医院还是软件公司,都投入了大量的人力、物力、财力。本课题根据前期的问卷调查以及实地考察,作出了适合实际的需求分析,采用了前后端分离的思想,后端使用了SpringBoot和SpringMVC框架,前端使用了Vue.js和ElementUI进行页面的搭建,并且使用了MySQL数据库进行数据交互。三者协同工作构建现代化、交互式的网页。原创 2025-03-26 21:40:27 · 681 阅读 · 0 评论 -
redisson分布式锁原理
但随着业务规模扩大,系统逐步转向分布式架构,传统的单机锁(如JUC锁)就显得不足,因为数据往往分布在多个节点上。但这种方案存在风险:如果在加锁后节点突然宕机,锁无法释放,导致后续其它节点无法加锁,形成死锁。如果在主节点成功加锁后,由于故障或宕机导致数据尚未同步到从节点,那么其他节点可能无法正确感知锁的状态,从而引发锁失效和并发安全问题。另外,如果业务处理时间超过锁的过期时间,锁会被提前释放,从而产生并发问题。因此,除了加锁和解锁的原子性,还需要在业务执行过程中对锁进行续期,确保业务完成前锁不会失效。原创 2025-03-26 11:47:46 · 854 阅读 · 0 评论 -
深入解析 RedissonMultiLock —— 分布式联锁的原理与实战
可以帮助我们同时锁定多个关键资源,只有所有子锁都成功后才执行后续操作,保证数据一致性。建议调用加锁方法前,根据实际情况设置合适的等待时间和租约时间,充分利用看门狗机制防止锁误释放;释放锁时最好判断当前线程是否持有该锁,以避免误解锁导致异常;应用场景:适用于分布式订单处理、跨服务协同操作和复杂事务控制等需要同时操作多个资源的场景。原创 2025-03-26 11:36:06 · 736 阅读 · 0 评论 -
基于Springboot的电影售票管理系统【附源码】
电影院售票系统(源码)」原创 2025-03-24 22:19:29 · 2064 阅读 · 2 评论 -
MyBatis-Flex、MyBatis-Plus 与 Fluent-Mybatis 的比较分析
MyBatis 是一个灵活且易于扩展的持久层框架。随着企业级项目需求的增长,传统 MyBatis 在面对 CRUD 操作、复杂查询时往往需要编写大量 XML 或注解代码。:以增强 MyBatis 的 CRUD 功能和语法糖著称,内置分页、代码生成、性能分析等功能。:在简化配置与开发的同时,更注重灵活性与扩展性,支持多种查询方式和动态 SQL 构造。:提供流式 API,让编写查询更加直观、优雅,降低了 SQL 编写的门槛。MyBatis-Flex 主要目标是减少冗余代码,提升开发效率。灵活配置。原创 2025-03-24 21:23:52 · 1822 阅读 · 0 评论 -
图书管理系统系统-Java、SpringBoot、Vue和MySQL开发的图书馆管理系统
「springboot、vue图书馆管理系统.zip」链接:https://pan.quark.cn/s/5a929a7e9450分享一个图书管理系统,Java、SpringBoot、Vue和MySQL开发的图书馆管理系统以下是对文本内容的总结:项目概述项目名称与背景:项目概述系统架构与技术栈主要功能模块系统设计与实现项目意义与总结整体来说,该图书馆管理系统为图书馆管理提供了一种全新的、稳定且高效的信息化解决方案,并具有良好的推广应用前景。在整理总结时,我提取了文档中各章节的核心内容,包括项目背景、技术选原创 2025-03-23 22:22:38 · 1028 阅读 · 0 评论 -
JDK 24 发布,新特性解读!
作为继Java 21之后的第三个非LTS版本,其技术革新力度远超预期——共集成24项JEP提案,相当于Java 22(12项)与Java 23(12项)的总和。值得关注的是,本次更新不仅包含语言层面的改进,更在密码学安全、运行时性能、并发模型等关键领域实现重大突破。随着量子计算与云原生架构的快速发展,Java 24在安全体系、运行时性能、开发者体验等方面的创新,为现代应用开发提供了更强大的基础支撑。建议开发者重点关注密钥派生API、类文件处理标准化等特性,这些改进将深刻影响未来三年的Java技术演进方向。原创 2025-03-21 13:49:46 · 1538 阅读 · 0 评论 -
Java多进程多线程处理详解
多进程多进程是指操作系统中同时运行多个独立的进程。每个进程都有自己独立的内存空间和系统资源,进程间通过进程间通信(IPC)进行交互。多进程适用于需要高隔离性、高稳定性的应用场景,如服务器中的多个独立服务。多线程多线程是指在一个进程内同时运行多个线程。线程是进程的一部分,共享进程的资源(如内存和文件句柄),线程间通信相对容易且高效。多线程适用于需要共享资源且需要高并发的应用场景,如GUI应用、网络服务器等。原创 2025-02-27 23:02:37 · 478 阅读 · 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 · 651 阅读 · 0 评论 -
Java 21 虚拟线程详解
虚拟线程内存占用低:无需为每个虚拟线程分配一个独立的操作系统线程,降低了系统资源消耗。高效上下文切换:由 JVM 内部调度管理,不涉及昂贵的 OS 级别线程切换,能更好地应对高并发场景。简而言之,虚拟线程可看作是“任务(Task)”,它们运行在传统的操作系统线程之上,但在代码层面与常规线程使用方式完全一致。为了避免因无限制并发导致 OOM 或对下游系统产生巨大压力,可借助信号量(Semaphore)和阻塞队列实现自定义虚拟线程池。/*** 构造函数。原创 2025-02-07 15:36:31 · 1849 阅读 · 0 评论 -
SpringBoot 实现图片防盗链功能
简单写死配置的方式,直接在拦截器中判断 Referer;基于配置文件灵活配置的方式,通过配置防盗链参数,并在拦截器中使用。虽然这种方法能对一般情况下的盗链行为起到一定防护作用,但考虑到 Referer 可伪造等问题,实际项目中还需根据具体场景综合考虑更全面的安全策略。原创 2025-02-05 11:47:17 · 497 阅读 · 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 · 1299 阅读 · 0 评论 -
深入理解Spring中的发布订阅模式:原理、实现与应用场景
Spring框架通过发布订阅模式为组件间通信提供了高效且松散耦合的解决方案,提升了系统的灵活性和扩展性。本文将探讨该模式的原理、实现、应用场景及其优势与挑战。定义事件类,事件类通常继承自我们可以定义一个类来表示用户注册成功的事件// 这里的User是一个包含用户相关信息的实体类// source:事件的源对象,用于表明这个事件是由哪个对象触发的Spring的发布-订阅模式通过和等组件,解耦了消息的生产者和消费者,并支持异步通信。这样可以让不同模块独立处理事件,提升系统的灵活性、可扩展性和响应速度。原创 2025-01-09 21:51:01 · 868 阅读 · 0 评论 -
MyBatis-Plus实现MySQL和Starrocks多数据源整合
项目中有需求要同时使用MySQL和Starrocks,正好整理一下,文末有完整代码包。原创 2024-10-26 19:09:11 · 1667 阅读 · 0 评论 -
国内Maven仓库镜像地址汇总及配置
打开 maven 的配置文件( windows 机器一般在 maven 安装目录的 conf/settings.xml ),在。标签中添加 mirror 子节点,例如。中添加repository子节点,例如。(偶尔需要人机验证,不推荐)Maven仓库示意图。原创 2024-10-24 09:39:41 · 15232 阅读 · 0 评论 -
Java LocalDateTime:日期处理新纪元
然而,令人遗憾的是,在 Java LTS 版本已经发展到 21 的今天,Java 8 引入的这些日期时间类却仍未被大多数开发者熟练掌握。在软件开发的征程中,项目的推进往往如一艘破浪前行的巨轮,然而,一个看似微不足道的日期处理任务,却可能引发一场意想不到的“完美风暴”。的时间信息完美结合,提供了一种不含时区信息的日期时间表示方式,特别适用于那些只需关注本地日期和时间,而无需考虑时区差异的场景。它们分别负责处理无时间的日期和无日期的时间信息,以其简洁而强大的设计,解决了众多日期时间处理中的难题。原创 2024-10-23 10:11:18 · 749 阅读 · 0 评论 -
征服ES(ElasticSearch)的慢查询实战
在 Elasticsearch(ES)中,进行大数据查询时,常常会由于多种因素而导致性能显著下降。接下来,我们将深入探讨几种常见情况及其相应的解决方案。原创 2024-10-18 21:53:37 · 894 阅读 · 0 评论 -
轻松实现 API 接口限流:Bucket4j 在 Spring Boot 中的应用
例如,对于一个速率限制为每分钟 100 个请求的应用程序接口,我们可以创建一个容量为 100 的水桶,每分钟填充 100 个令牌。如果在一分钟内收到 70 个请求,少于可用令牌的数量,那么在下一分钟开始时,我们只需再添加 30 个令牌,就能使水桶达到容量。另一方面,如果在 40 秒内用完了所有令牌,我们将等待 20 秒来重新装满令牌桶。在请求消耗令牌的同时,我们也在以某种固定的速度补充令牌。它基于令牌桶算法,提供了强大的限流功能,既可用于独立的 JVM 应用程序,也可用于集群环境。原创 2024-10-18 21:52:42 · 1610 阅读 · 0 评论 -
Git不要只会pull和push,搞上5个提升效率的命令!
今日,为大家带来五个能让你从 Git 菜鸟迅速晋级为老鸟的高效命令,助你在编程之路上如鱼得水。在编程过程中,常常会遇到这样的情况:写了一半的代码,突然领导要求紧急修复一个 bug,而此时手上的改动又不能立即提交。当在开发分支上完成了一个出色的功能,想要快速应用到主分支上展示时,cherry-pick 命令就是最佳选择,它可以将指定的 commit 应用到当前分支。提交代码后,若发现存在问题或不该提交某些内容,软回溯命令就能发挥作用,将 commit 回滚同时保留修改。revert 命令就是你的得力助手。原创 2024-10-18 21:49:37 · 992 阅读 · 0 评论 -
JDK 21更新:switch语句的类型模式匹配与守卫模式
JDK 21中的switch语句和表达式的增强,使得Java语言在处理复杂条件和类型检查方面更加灵活和强大。类型模式匹配、守卫模式、模式匹配的switch表达式、改进的类型推断以及增强的错误检测能力,使得代码更加简洁、易读和易于维护。这些改进不仅提高了开发效率,还为开发者提供了更强大的工具来编写更加可靠和可维护的代码。原创 2024-10-17 21:25:03 · 780 阅读 · 0 评论 -
class 文件分析
Java 是跨平台的,JVM 作为中间层,自然要针对不同的操作系统提供不同的实现。通过不同操作系统的 JVM,源代码就可以不用根据不同的操作系统编译成不同的二进制可执行文件了,跨平台的目标也就实现了。那这个 class 文件到底是什么玩意呢?它是怎么被 JVM 识别的呢?编写一段简单的 Java 代码,文件名为 Hello.java。点击编译按钮后,IDEA 会自动生成一个名为 Hello.class 的文件,在的对应包目录下。原创 2024-10-10 09:20:37 · 783 阅读 · 0 评论 -
Java 8 的内存结构
由于java是一门高级语言,离硬件底层比较远,有时候无法操作底层的资源,于是,java添加了native关键字,被native关键字修饰的方法可以用其他语言重写,这样,就可以写一个本地方法,然后用C语言重写,这样来操作底层资源。当然,使用了native方法会导致系统的可移植性不高,这是需要注意的。int a=1;//这个1便是字面量//iloveu便是字面量。原创 2024-10-10 09:19:37 · 698 阅读 · 0 评论 -
小巧简单的JAVA字节码开源编辑器
jclasslib,可以理解他是一个工具,用于查询已编译成JAVA类的各种文件的实际内容,也可以通过jclasslib直接进行这些类文件的编写,jclasslib自带一个库,可以方便用户快速读写编辑类文件。引入JAVA类后,可以看到其,一般信息、常量池、接口、字段、方法、属性,并且可以分别进行查阅。jclasslib 可以切换中文、英文、波兰文、德文,并且可以自动识别系统当前使用语言;jclasslib,同时可以支持linux、mac、windows、unix多个平台。原创 2024-10-09 09:10:15 · 275 阅读 · 0 评论 -
为什么用元空间替换永久代
首先需要明确的是,以下讨论的HotSpot虚拟机,其他类型的虚拟机,例如JRockit与J9等,压根就没有永久代的概念。因此,下面所说的“虚拟机”都是HotSpot版本的。要想理解这种变化的原因,需要先理解方法区、永久代与元空间的概念与之间的关系。原创 2024-10-09 09:09:41 · 2017 阅读 · 0 评论 -
Java 类加载的几个阶段
如果要查找类加载器,通过方法可以获取。从运行结果可以看到,当前的类加载器是,它的上一级是,再上一级是null。其实的上一级是有类加载器的,它叫Bootstrap ClassLoader,是一个启动类加载器,由 C++ 实现,不是 ClassLoader 子类,因此以 null 作为结果返回。这几种类加载器的层次关系,可以用如下图来描述。在虚拟机启动后,会优先初始化Bootstrap Classloader。原创 2024-10-08 09:21:12 · 1315 阅读 · 0 评论 -
Java 类加载过程
开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。原创 2024-10-07 08:42:28 · 1105 阅读 · 0 评论 -
Java内存区域
Java内存区域。原创 2024-10-07 08:41:55 · 773 阅读 · 0 评论 -
JVM 内存布局
我们先来说堆。堆是 OOM 故障最主要的发生区域。它是内存区域中最大的一块区域,被所有线程共享,存储着几乎所有的实例对象、数组。所有的对象实例以及数组都要在堆上分配,但是随着 JIT 编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上也渐渐变得不是那么“绝对”了。Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC 堆”。从内存回收的角度来看,由于现在收集器基本都采用分代收集算法,所以 Java 堆中还可以细分为:新生代和老年代。原创 2024-10-07 08:41:26 · 1098 阅读 · 0 评论