自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 Node模块天生单例,Java为何偏要Spring Boot?一场跨语言的容器之争

但 Spring Boot 不是一个"单例工具",它是一套对象生命周期治理框架,涵盖依赖注入、AOP、事务、作用域、生命周期、自动装配、生态整合。Spring Boot 解决的核心问题不是"如何只有一个实例",而是"如何在复杂依赖网络中把对象的创建、装配、增强、销毁全部管起来"。综合来看,Node 的语言级能力确实比 Java 更适合手搓 AOP 和对象代理,但这恰恰说明:Node 缺的不是语言能力,而是一个约定俗成的容器规范。但原型链解决的是"对象长什么样",不解决"对象从哪来、依赖谁"。

2026-08-04 23:59:25 32

原创 Language Support for Java 全配置属性盘点与源码解析

VSCode 生态中,由 Red Hat 出品的 Language Support for Java™ by Red Hat 扩展是 Java 开发者的核心生产力工具。它背后运行着 Eclipse JDT Language Server,通过 LSP 协议将完整的 Java 语言服务能力接入 VSCode。该扩展提供了 130 余项可配置属性,覆盖从语言服务器启动、项目导入、构建工具集成到代码补全、格式化、重构等全部环节。

2026-08-04 23:57:57 42

原创 VS Code Java 调试源码路径解析全链路剖析

VS Code 前端├─ settings.json → 控制 JDT LS 行为└─ launch.json → 传递 sourcePaths 到 DAP 层│▼LSP 层(JDT LS)├─ OSGi 容器启动 → 加载 java-debug plugin bundle├─ Maven 项目导入 → 生成 .classpath└─ 注册 Debug 命令处理器│▼DAP 层(java-debug)

2026-08-03 21:25:47 403

原创 Maven 源码包的下载与工程化落地

问题在于,源码始终以 jar 形态存在。第三步,逐行读取依赖清单,按 groupId 转路径规则定位 sources jar,跳过不存在与 test 作用域的,解压到。个别依赖未发布 sources jar 时,脚本会跳过并计入 missing 计数,多见于小众库或内部私有库,主流框架基本齐全。要让 Agent 真正看见第三方源码,最直接的方式是把源码从 jar 中释放出来,以裸文件形式落到工程目录下。因此下载源码不能只看 pom 直接声明的依赖,必须遍历全部传递依赖,逐个定位真正包含代码的构件。

2026-08-03 20:58:24 352

原创 用 Git 为本地文件打造一台时光机

仓库,文件监听工具在后台盯着每一个文件的增删改,一旦有变化就触发提交脚本,变化被锁机制串行吸收进快照历史,同时写入监控日志;下面是三个脚本的完整代码。它不替代正式的版本管理,而是为那些介于正式提交之间的细碎变化提供一张安全网,让本地文件的每一次状态都有迹可循。如果能把 Git 的部分能力单独抽出来,只服务于本地文件的快照记录,就能得到一台时刻运转的时光机。把执行脚本和快照脚本配合使用,就形成了完整的证据链:某条命令在什么时间执行、耗时多久、成功与否,命令结束后工作目录发生了哪些文件变化,全部有据可查。

2026-08-02 22:57:33 768

原创 给 Electron 做一场减重手术

Electron 的"重量"并非一日积累,而是十年生态演进的代价——它用体积换来了开发效率,用内存换来了跨平台一致性,用打包复杂度换来了运行时简单性。这些 trade-off 在 Electron 诞生时是合理的,但在 Tauri 已经证明"轻量也能做到"的今天,是时候重新审视这些权衡了。从 Tauri 身上可以借鉴的,不只是"用系统 WebView"这一个技巧,更是一种"借力打力"的架构哲学——不重复造轮子,不打包已经存在的东西,不加载用不到的能力。

2026-08-02 22:53:04 297

原创 磁盘空间去哪了:一个脚本看清Windows磁盘占用真相

C盘又飘红了,可你根本说不清是哪个目录吃掉了空间。这种无力感,几乎是每个Windows用户的共同记忆。

2026-07-30 22:51:11 140

原创 从 0.1 到 26:一个运行时的十七年进化史

2009 年 5 月 27 日,一个叫 Ryan Dahl 的年轻人往 GitHub 上推了第一个 commit。那是一个用 C++ 写的 JavaScript 运行时,把 Google 开源的 V8 引擎包了一层,加了一个事件循环和一个底层 I/O 接口。初始版本号 0.1.0,只跑在 Linux 和 macOS 上,连 Windows 都不支持。半年后的 11 月 8 日,Dahl 在柏林的 JSConf EU 上做了第一次公开演示。那场演讲结束时,台下起了 standing ovation。

2026-07-30 22:16:58 354

原创 告别版本地狱:跨语言版本管理器终极对决与最佳实践

版本管理器看似是开发流程中的一个小环节,但它直接影响着开发体验和团队协作效率,是值得认真对待的基础设施。从 nvm 到 fnm,从 pyenv 到 uv,从 SDKMAN 到 mise,整个领域正在经历一场从 Shell 脚本到 Rust 二进制的性能革命,同时也从单一语言管理走向多语言统一管理,这是技术发展的必然趋势。选择版本管理器没有绝对的对错,关键在于匹配项目需求和团队现状,适合自己的才是最好的。

2026-07-29 23:47:19 197

原创 IDEA 调试器表达式计算源码拆解:一行表达式在虚拟机里的奇幻漂流

本文以 IntelliJ Community 源码为蓝本,拆解这条链路上的每一个关键角色,看看 JetBrains 的工程师如何用一套精巧的双模式架构,把"在断点处求值任意 Java 代码"这件看似不可能的事,做得既稳健又优雅。这种"开放封闭"的架构,让 IDEA 的调试能力成为一个真正的平台,而非一个封闭的产品。在调试这种对状态一致性要求极高的场景里,这个取舍是值得的。,是所有"需要计算才能得到值"的描述符的基类——Watch 项、Evaluate 对话框里的表达式、变量悬停提示,背后都是它的子类。

2026-07-29 23:44:11 210

原创 告别Postman——用VSCode优雅地发起Http请求

Http 协议(RFC 2616,后来被 RFC 7230 取代)规定了请求的标准结构:第一行是请求行(方法 + URL + 协议版本),随后是若干行请求头,中间用空行分隔,最后是请求体。修复代码后,再次点击验证。从今天开始,在你的项目里创建一个 .http 文件,把第一个接口写进去,点击 Send Request,体验一下这种"像写代码一样调接口"的感觉吧。这个案例展现的正是 .http 文件的魅力:多个请求分层排列,注释清晰标注每个请求的用途,变量统一管理环境信息,文件本身就是一份可执行的测试计划。

2026-07-28 22:54:21 637

原创 Plop 代码生成实践:从模板到批量文件输出

它基于 Handlebars 模板引擎,通过 JSON 数据驱动模板渲染,适合任何"根据数据批量生成结构化文件"的场景。有两条自动行为:自动去掉每个元素左侧的换行,以及自动去掉最后一个元素右侧的换行。具体实现原理需要查看 Handlebars 源码,暂不深究,但这两条行为在写模板时是必须清楚的。块在换行处理上有一些隐蔽行为,写模板时如果不清楚这些规则,生成的文件会出现多余空行或缺少换行。标签后的第一个换行,不需要任何额外处理。的最后一行,通过子进程将模块名代理给 Plop CLI,这是整个生成流程的起点。

2026-07-28 22:43:02 211

原创 Gradle 版本演进全景:构建工具的进化密码

除了插件提供的任务,开发者经常需要编写自定义任务。最简单的方式是用注册一个闭包任务,更复杂的需求则可以定义 Task 类。doLast {println "发布版本${projectversionprintln "发布版本 ${ project . version } " } }Copy 是 Gradle 内置的任务类型,它已经实现了增量构建和缓存支持。继承内置任务类型比自己从零实现要省心得多,这也是 Gradle 推荐的实践。

2026-07-26 23:01:00 292

原创 Jackson 使用指南

Jackson 是 Java 生态中最流行的 JSON 处理库,由 FasterXML 团队维护。它提供了高性能的 JSON 序列化与反序列化能力,广泛应用于 Spring Boot、Dropwizard 等主流框架中。Jackson 的核心优势在于其流式 API 的高性能、注解驱动的灵活配置,以及对复杂 Java 类型(如泛型、多态、嵌套对象)的完整支持。Jackson 由三个核心模块组成,分别是 jackson-core、jackson-annotations 和 jackson-databind。

2026-07-26 21:31:08 322

原创 同一个团队的两段传奇:Puppeteer 与 Playwright 背后的开发者故事

留在 Google 的 Puppeteer 延续了 Chromium 优先的路线,持续深耕 Chrome 与 Chromium 的自动化能力,在爬虫、PDF 生成、截图服务等以 Chromium 为目标的场景中保持着轻薄与高效的优势。这种选择的代价是庞大的工程复杂度与浏览器二进制的体积,但换来的是测试团队梦寐以求的"一套用例,多浏览器回归"能力。随着时间的推移,两个项目的定位越来越清晰:Puppeteer 是 Chromium 自动化的利器,Playwright 是跨浏览器端到端测试的框架。

2026-07-24 23:59:41 185

原创 Puppeteer 与 Playwright 全维度简要对比解析

Puppeteer 诞生于 2017 年,由 Google Chrome DevTools 团队开发并开源,最初的定位是为 Chrome 与 Chromium 提供一套基于 Node.js 的高层级自动化 API。它是业界第一个将 Chrome DevTools Protocol(CDP)封装为可用编程接口的主流库,让开发者无需直接处理底层协议细节,就能用 JavaScript 驱动浏览器完成页面渲染、表单提交、截图、PDF 生成等任务。Puppeteer 出现的时机恰逢无头浏览器自动化需求爆发,迅速成为爬

2026-07-24 23:44:21 169

原创 Spring Boot 框架注解盘点

理解 Spring Boot 注解的最佳方式是把握它们在启动流程中的协作关系。当一个 Spring Boot 应用启动时,注解的执行遵循明确的时序:首先 @SpringBootApplication 触发启动流程,其元注解 @SpringBootConfiguration 标识主配置类,@EnableAutoConfiguration 触发自动配置加载,@AutoConfigurationPackage 注册基础包路径。

2026-07-23 23:59:31 509

原创 Spring框架注解盘点

当引导阶段完成ApplicationContext的构建和组件扫描后,Spring会进入Bean定义的注册阶段。在这一阶段,被@ComponentScan扫描到的类、被@Import导入的类、被@Bean方法返回的对象,都会被转化为BeanDefinition注册到BeanDefinitionRegistry中。Bean定义注册阶段决定了容器中最终会有哪些Bean,以及这些Bean的名称、作用域、初始化方式等元信息。Spring框架的注解体系覆盖了应用从启动到运行的完整生命周期。

2026-07-23 23:37:43 301

原创 Quarkus 优缺点深度剖析:来自 Spring Boot 开发者的视角

从 Spring Boot 开发者的视角审视 Quarkus,我们看到的是一个设计哲学截然不同但目标一致的框架。Spring Boot 追求的是开发效率和生态完整性,它通过运行时反射提供了极大的灵活性,代价是启动慢、内存大、与云原生环境的适配存在张力。Quarkus 追求的是运行时性能和云原生适配,它通过构建期处理消除了运行时反射开销,代价是动态性受限、生态成熟度不足、学习曲线较陡。

2026-07-22 22:03:57 338

原创 深入 Quarkus:云原生时代 Java 的重生之路

Quarkus 代表了 Java 在云原生时代的一次重要进化。它没有抛弃 Java 的生态和规范,而是重新定义了 Java 框架的运行时模型,把传统框架在运行时通过反射完成的工作前移到构建期,从而实现了启动时间、内存占用、首请求延迟的全方位优化。这种"构建期计算、运行时执行"的范式,不仅让 Java 应用在云原生场景下重新具备了竞争力,也为 Java 框架的设计提供了新的思路。Quarkus 的意义不仅在于性能优化,更在于它证明了 Java 生态能够自我革新。

2026-07-22 21:53:07 378

原创 源码视图技术:集 APT 和 AST 所长

本文探讨了Java注解处理器(APT)和AST修改技术在代码增强中的优缺点,并提出了源码视图技术的解决方案。APT标准化但无法修改已有类,AST可修改类但结果不可调试。源码视图技术通过让开发者编写的类和增强后的视图类共存,编译时用视图类替换原始类,既保留了AST修改能力,又使增强结果可观察和调试。文章详细分析了项目结构设计、构建逻辑演进过程,最终提出通过将生成代码直接纳入编译范围来消除循环依赖,实现源码视图技术的完整落地。

2026-07-21 21:19:47 873

原创 Java HTTP 请求框架对比

Apache HttpClient 是 Apache HttpComponents 项目下的子项目,前身可追溯到 Jakarta Commons HttpClient。HttpClient 5 是一次重大重构,将原来混乱的 API 拆分为 Classic(阻塞)和 Async(异步)两套独立 API,并引入了新的 I/O 模型。

2026-07-21 21:10:18 317

原创 Maven 实现直接获取内部模块类路径

本文解析了Maven Reactor机制在多模块项目中的关键作用,解决了不执行install直接运行项目的痛点。当脱离父工程单独构建子模块时,Maven会错误地在仓库中查找内部模块依赖。通过保留Reactor上下文(在根目录构建)、使用-am参数自动构建依赖模块,并确保先执行compile阶段生成target/classes,即可实现依赖的"短路解析"。文中演示了如何利用dependency:build-classpath插件正确获取包含内部模块编译产物的类路径,最终生成的文件将同时包含本地工程目录和仓库中

2026-07-20 21:58:40 342

原创 从IDEA迁移到VSCode

本文对比了IntelliJ IDEA和VSCode在Java开发中的核心功能差异。IDEA凭借深度语义分析和智能补全、完善的代码导航、强大的重构能力以及专业的JVM调试器,仍是Java开发的首选。而VSCode通过扩展包提供轻量级Java支持,在基础编辑、补全和调试方面表现尚可,但在智能补全精度、重构种类和调试深度上存在明显差距。作者建议,若项目以Java为主且需要企业级功能,仍应选择IDEA;若主要开发多语言项目或追求轻量级体验,可尝试VSCode,但需接受部分功能缺失。

2026-07-20 20:52:06 191

原创 Java 8 编译器扩展点

摘要 OpenJDK 8的javac编译器采用三层API架构: 内部实现层(com.sun.tools.javac.*):核心编译器逻辑,但跨版本可能不兼容。 工具层(com.sun.source.util.*):面向IDE/工具的中间API,小版本间相对稳定。 标准API层(javax.tools.*等):JSR标准接口,跨版本兼容。 扩展编译器的两种主要方式: 标准路径:通过JSR 199/269的JavaCompiler和注解处理器,官方支持且稳定。 内部路径:利用Plugin、TaskListene

2026-07-19 23:48:24 357

原创 Windows 环境使用 Git Bash 最佳实践

文章摘要:Git Bash 调用 Windows 程序时,MSYS2 会对路径、引号等特殊字符自动转换,导致 /c 被转成 C:/、引号被过度转义等问题。可通过双斜杠 //c 绕过路径转换,使用 cygpath 显式转换路径格式,或通过 MSYS_NO_PATHCONV 禁用转换。引号问题建议用 heredoc 或管道绕过参数解析。start 命令标题异常时,可改用 heredoc 或直接调用 cmd.exe 解决。

2026-07-08 18:34:28 383

原创 Git 功能发展历史

本文系统梳理了Git版本控制系统从2005年诞生至今的演进历程,将其划分为多个关键发展阶段。文章首先介绍了Git诞生的背景与核心设计哲学,即Linus Torvalds为解决Linux内核开发需求而设计的分布式、高性能、强完整性系统。随后详细阐述了各个版本的主要改进:1.x系列奠定了基础功能架构;2.0版本引入重大行为变更;2.x系列持续优化性能与用户体验,包括引入switch/restore命令、Partial Clone等高级功能;2.38版本开始支持超大规模仓库。全文突出Git"底层稳定、上层演进"的

2026-07-04 12:11:43 438

原创 MapStruct 与 Lombok 协作的注解处理器执行顺序分析

配置并不保证解析后的 jar 排列顺序与依赖声明顺序严格一致——配置的解析顺序受 Gradle 内部依赖解析策略的影响,在存在传递依赖或版本冲突时,实际顺序可能偏离声明顺序。中 Lombok 的 jar 排在 MapStruct 的 jar 之前,即可确保 Lombok 先完成代码生成,随后 MapStruct 再读取已修改的 AST 结构。方法,其所生成的代码并不存在,MapStruct 读取到的仍然是未经过 Lombok 处理的原始 AST,于是报错。需要指出的是,Gradle 的。

2026-06-01 19:32:42 213

原创 Jackson 自定义反序列化器的类型不匹配陷阱

本文揭示了Jackson自定义String反序列化器的一个潜在缺陷:当未校验token类型时,非字符串输入会被静默转换为null而非抛出异常。通过示例代码对比发现,默认反序列化器会抛出MismatchedInputException,而未经校验的自定义反序列化器则通过getValueAsString()返回null。建议在自定义反序列化器中模仿默认行为,先校验token类型再处理值,以保证类型安全性和一致性。这种差异可能导致隐蔽的运行时错误,需要特别注意。

2026-05-29 21:33:06 206

原创 Java 类功能增强技术选型:从编译时到运行时的全景解析

Java类增强技术综述:从编译到运行时的全生命周期解析 摘要:本文系统梳理了Java类增强技术在编译时、编译后、加载时和运行时四个阶段的主流实现方案。编译时增强包括APT注解处理器、Lombok AST修改和AspectJ编译时织入;编译后增强涵盖ASM、Javassist和Byte Buddy等字节码操作框架;加载时增强主要基于Java Agent机制;运行时增强则通过动态代理等技术实现。文章详细分析了各类技术的原理机制、适用场景及优缺点,指出编译时增强具有零运行时开销但灵活性受限,而运行时增强灵活但性能

2026-05-24 19:04:08 361

原创 极致简单的哈希表

大佬大佬,JDK的`HashMap`运行效率确实高,但太难理解,有没有更加简单的`HashMap`实现?有的,兄弟,有的!

2025-07-16 19:36:27 666

原创 一步一步分析@SneakyThrows原理

Lombok利用泛型类型擦除的漏洞来绕过编译器检查,欺骗编译器相信抛出的是`RuntimeException`,实际抛出原始检查异常`FileNotFoundException`

2025-07-08 18:44:54 388

原创 设计模式实战:从硬编码到灵活扩展的单位转换器

通过重构单位转换器案例,揭示如何运用设计模式打造高扩展性系统,告别大量的条件判断语句!

2025-07-06 12:50:33 532

原创 Maven仓库与镜像配置解析过程揭秘

一般常见的误区是认为镜像的配置顺序会影响仓库的访问顺序,但实际上,镜像只是替换url,不改变仓库的顺序。中央仓库(central)是默认的仓库,即使没有显式配置中央仓库,在配置的全部仓库中如果没有找到依赖,最终也会使用中央仓库。也就是说,镜像的存在不会改变仓库的访问顺序,只是改变了访问的地址。因此,仓库的声明顺序始终决定访问尝试的先后次序,而镜像只负责替换实际请求的URL,不会改变仓库的尝试顺序。,那么无论全部声明的仓库的顺序如何,仓库地址是什么,所有仓库的请求都被镜像拦截,都会去访问镜像M的地址。

2025-06-21 19:37:26 687

原创 2025年 IDEA 插件推荐,告别低效!

IDEA插件没有绝对的好坏,每个人的需求不一样,选择合适的插件,并定期清理和维护,才能提高效率,否则适得其反。会将不同层级的括号用不同的颜色标记出来,很快就能分辨出括号的对应关系,避免括号匹配错误。我更喜欢默认的括号高亮显示,它已经足够清晰了,不需要额外的颜色区分,反而眼花缭乱的颜色可能会造成视觉上的干扰,所以没有使用Rainbow Brackets。CodeGlance。

2025-03-02 14:52:00 2831

原创 看看我的Idea配置

工欲善其事,必先利其器,我相信在座的各位后端同行都在用IDEA,如果你告诉我你用Eclipse,我只能说6我使用IDEA已经三年了,使用它已经是得心应手了,下面将介绍我本人常用的Idea配置在图中为求简洁(不是我偷懒),我会用箭头指出每个配置项的说明,从上往下,从1开始说明以前我喜欢Idea纯净的Light模式,想折腾主题就下载了插件自定义主题配色,发现自己老是不小心配成阴间颜色,后来在idea插件商店发现了最热门的插件,就下载了它,可以在主题配置中选择One Dark进行配置,个人根据比Idea的默认夜间

2023-09-14 20:46:27 304 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除