- 博客(112)
- 收藏
- 关注
原创 Spring Boot 的自动装配机制和 Starter 的实现原理
摘要:SpringBoot通过自动装配机制实现"约定优于配置",核心是@EnableAutoConfiguration注解和条件化配置。自动装配流程包括加载spring.factories文件、条件过滤和配置注入。Starter作为依赖模块,包含库依赖、自动配置类和默认配置,可通过定义MyAutoConfiguration类和注册到spring.factories实现自定义。二者结合使开发者只需引入Starter即可获得完整功能,显著提升开发效率。
2026-01-25 15:39:28
374
原创 Spring Boot 和 Spring异同
SpringBoot和Spring是Java生态中紧密关联又各具特色的框架。Spring作为基础框架提供IoC、AOP等核心功能,需要手动配置;而SpringBoot基于Spring封装,通过自动配置、内嵌容器等特性实现快速开发。关键区别在于:Spring需要显式配置组件和管理依赖,适合深度定制;SpringBoot采用约定优于配置,内置运维功能,显著提升开发效率。二者可协同使用,SpringBoot不是替代品而是增效器
2026-01-25 15:35:10
380
原创 分布式锁的实现原理
分布式锁是确保分布式系统中共享资源互斥访问的关键技术,主要解决数据冲突和一致性问题。主流实现方案包括:基于数据库(简单但性能差)、基于Redis(高性能但存在极小失效风险)和基于ZooKeeper(强一致但复杂)。Redis方案需注意原子性加锁、唯一标识和安全释放;ZooKeeper方案通过临时顺序节点避免"羊群效应"。选型需权衡性能与一致性,Redis适合高并发场景,ZooKeeper适合强一致性要求场景。实践关键:确保锁释放和验证持有者。
2026-01-24 14:30:11
1065
原创 spring循环依赖
摘要:循环依赖指Bean间相互依赖形成的闭环,Spring通过三级缓存机制解决Setter/Field注入导致的循环依赖,但无法处理构造器注入的情况。解决方案包括改用Setter注入、使用@Lazy延迟加载、重构设计提取公共逻辑等。需注意构造器循环依赖必须通过代码优化解决,过度依赖循环解决可能掩盖设计缺陷。(149字)
2026-01-24 14:17:30
257
原创 Bean的生命周期
摘要:Spring框架中Bean的生命周期由容器管理,包含多个关键阶段:实例化、属性注入、初始化回调(@PostConstruct、InitializingBean、init-method)和销毁回调(@PreDestroy、DisposableBean、destroy-method)。容器通过BeanPostProcessor提供初始化前后处理扩展点,支持Aware接口获取容器资源。单例Bean由容器管理销毁,原型Bean则需手动释放。该机制通过标准接口和注解(如JSR-250)实现灵活的生命周期控制,典
2026-01-24 12:27:07
822
原创 @transactional事务失效场景
摘要:SpringBoot事务失效常见原因包括:未启用事务管理、非public方法调用、自调用问题、异常类型不匹配、数据库引擎不支持、多数据源未指定、传播行为配置不当、异步方法调用等。解决方法包括:添加@EnableTransactionManagement注解、确保方法为public、避免自调用、配置rollbackFor、使用InnoDB引擎、指定事务管理器、调整传播行为等。验证方法可通过日志调试、手动回滚测试或检查数据库连接自动提交状态。
2026-01-24 12:22:22
214
原创 Spring 框架中的 IoC (控制反转) 和 AOP (面向切面编程) 及其应用
摘要: Spring框架的两大核心特性是IoC(控制反转)和AOP(面向切面编程)。IoC通过依赖注入(DI)实现,将对象创建和依赖管理交由容器处理,降低耦合度,提高可测试性。AOP则通过代理机制将横切关注点(如日志、事务)与业务逻辑分离,使用切面、切入点、通知等组件实现功能增强。二者协同工作:IoC管理基础Bean,AOP增强这些Bean的功能。这种组合显著提升了代码的模块化、可维护性和扩展性,是Java企业应用开发的重要范式。
2026-01-24 11:55:56
890
原创 tcc中的空回滚和悬挂问题
TCC事务模型中的空回滚和悬挂问题是分布式系统的关键挑战。空回滚发生在Cancel阶段发现Try未执行时,可能导致数据不一致;悬挂则因迟到的Try请求在全局事务回滚后执行,造成资源永久占用。解决方案的核心是引入事务状态表:在Try前记录状态,Cancel时检查状态决定是否执行回滚,Try执行前检查是否存在已回滚记录。关键实践包括保证幂等性、注意操作顺序(先记录状态再执行业务),从而有效应对网络不确定性带来的问题。
2026-01-24 11:21:31
884
原创 类加载机制,双亲委派模型及如何打破双亲委派模型,heppens-before原则,内存屏障如何保证有序并禁止指令重排
本文摘要:Java类加载机制包括加载、链接和初始化三个阶段,采用双亲委派模型确保安全性和避免重复加载。特殊场景(如热部署)可通过重写loadClass方法或使用线程上下文类加载器打破该模型。多线程方面,Happens-Before原则定义操作顺序保证可见性,内存屏障通过禁止指令重排(如volatile变量的读写屏障)确保有序性。这些机制共同维护了JVM的安全性和多线程程序的正确执行。
2026-01-23 16:01:21
252
原创 Java关键字、GC回收器与JVM调优详解
摘要:Java多线程编程中,synchronized提供线程安全但可能影响性能,volatile确保变量可见性但不保证原子性,transient用于跳过敏感字段的序列化。JVM提供多种GC回收器:SerialGC适合小型应用,ParallelGC注重吞吐量,CMS/G1/ZGC针对低延迟场景。JVM调优需合理设置堆大小(-Xms/-Xmx),根据应用特性选择GC策略(如G1的-XX:MaxGCPauseMillis),并通过日志监控(-XX:+PrintGCDetails)持续优化。
2026-01-23 15:54:41
796
原创 jvm内存模型和内存结构
JDK8及以后的JVM内存模型延续了多线程交互的核心规则,同时进行了重要优化。内存结构上,移除了永久代,引入元空间(Metaspace)存储类元数据,使用本地内存避免了OOM问题。堆内存仍分为新生代和老年代,字符串池移至堆内存。新增G1作为默认垃圾回收器,支持更高效回收。JMM通过happens-before原则保证原子性、可见性和有序性。参数配置上可调整堆大小(-Xms/-Xmx)和元空间大小(-XX:MetaspaceSize)。这些改进提升了JVM的灵活性和性能表现。
2026-01-23 15:48:42
298
原创 跳出多层循环的方式
本文介绍了Java中跳出多层循环的四种方法:1.使用标签跳出指定循环,通过break加标签名直接终止外层循环;2.将循环封装为方法,通过return终止所有循环;3.设置布尔标志变量控制循环终止;4.通过代码重构减少嵌套深度。文章比较了各方法的适用场景,指出标签跳转需谨慎使用,方法返回适合逻辑隔离,条件变量要确保变量可被检测,重构代码可降低复杂度。
2026-01-22 17:23:43
252
原创 Java 的基础概念
基本类型:8 种,直接存储值==vsequals:值/地址 vs 内容关键字final→ 不可变static→ 类级别→ 循环控制→ 接口实现try-catch→ 异常处理建议通过实际编码练习加深理解!
2026-01-22 17:18:06
401
原创 JDK的组成
JDK是Java开发工具包,包含编译器(javac)、运行器(java)、打包工具(jar)等开发工具,以及完整的Java API类库和JRE。JRE则是Java运行环境,仅包含运行Java程序所需的JVM和核心类库。主要区别在于:JDK面向开发者,具备开发功能;JRE面向终端用户,仅支持程序运行。JDK已包含JRE,因此开发者安装JDK后即可同时进行开发和运行。普通用户若只需运行Java程序,安装JRE即可。
2026-01-22 16:52:38
500
原创 面向对象编程特征
面向对象编程(OOP)的核心思想是将现实事物抽象为对象,具有四大特征:封装通过访问控制符隐藏实现细节;继承使用extends实现代码复用;多态通过方法重载/重写实现统一接口处理不同类型对象;抽象通过抽象类和接口定义行为规范。这些特征使代码更模块化、可维护和可扩展,是掌握OOP的关键。
2026-01-22 16:42:10
637
原创 lru算法代码实现
本文介绍了Java实现的LRU(最近最少使用)缓存算法。该算法通过HashMap存储键值映射实现O(1)查找,配合双向链表维护访问顺序:头节点为最近使用,尾节点为最少使用。核心操作包括get()和put()方法,分别处理缓存查询和更新,当缓存满时会自动移除尾节点。所有操作均保持O(1)时间复杂度,代码实现包含节点管理、链表调整等辅助方法,并提供了测试示例。该实现高效简洁,适用于需要缓存管理的应用场景。
2026-01-22 15:07:51
144
原创 抢红包二分均值代码实现
本文介绍了抢红包功能的二分均值算法实现(二倍均值法),通过动态计算金额上限确保公平分配。算法核心是为每位接收者生成不超过剩余均值的随机金额(上限为剩余金额/剩余人数×2),避免极端值并保证总额准确。Java代码展示了具体实现:初始化参数后,循环分配前n-1人(随机金额最小0.01元),最后一人直接获得剩余金额。代码包含边界处理、金额精度控制(保留两位小数)和总额验证,时间复杂度O(n)。示例演示了100元分给10人的场景,验证了算法的正确性和实用性。
2026-01-22 15:03:12
316
原创 代码review
代码审查需系统化关注功能正确性、安全、异常处理等核心要素,同时兼顾可维护性、性能和可测试性。重点检查边界条件、安全漏洞(如SQL注入)、代码规范,并评估算法复杂度。建议使用SonarQube等工具辅助分析,建立审查清单模板,对关键模块实施结对审查,定期复盘代码问题,持续改进审查质量。
2026-01-22 10:28:32
187
原创 倒排索引数据结构
摘要:倒排索引的高效检索依赖于FST和位图两种核心数据结构。FST通过前缀压缩实现关键词快速定位,查询复杂度仅与关键词长度相关;位图则利用比特位表示文档集合,支持高速位运算处理多条件查询。两者协同工作:FST首先定位关键词,位图随后处理文档集合运算。FST提供内存高效压缩,位图实现并行计算优势,共同支撑海量数据下的快速检索。这种组合设计平衡了存储效率与计算性能,是搜索引擎实现毫秒级响应的关键技术基础。(149字)
2026-01-20 13:37:42
381
原创 常用限流算法
摘要:本文对比了四种常用限流算法的特性及应用场景。固定窗口算法实现简单但精度低;滑动窗口能缓解临界突刺;漏桶算法输出绝对平滑但无法处理突发;令牌桶算法兼具平滑与突发处理能力。选择时需考虑业务需求:简单场景用固定窗口,严格限速用漏桶,用户体验优先选令牌桶,高精度要求用滑动窗口。分布式环境需结合Redis等中间件实现,并合理设置阈值和降级策略。
2026-01-20 11:44:23
399
原创 接口的路由和负载均衡
摘要:路由和负载均衡协同构建高可用分布式系统。路由层(条件/标签/脚本路由)按业务规则筛选服务提供者,负载均衡层(随机/轮询/最少活跃/一致性哈希)从筛选结果中选择最优节点。路由是流量导航,负载均衡是最终调度,两者配合实现流量管控和性能优化。配置时可动态调整路由规则和负载均衡策略,不同场景(如灰度发布、性能优化)需采用不同组合方案。
2026-01-20 11:40:21
1458
1
原创 验签鉴权全局过滤
使用全局过滤器实现验签鉴权,是构建安全微服务网关的有效策略。它能集中处理安全逻辑,保证API调用的合法性和数据完整性。您可以根据实际业务需求,调整上述示例中的签名规则、客户端信息管理方式和异常处理机制。希望这些信息能帮助您顺利实现需求。如果您在特定技术细节上需要更深入的探讨,欢迎随时提出。
2026-01-20 08:56:29
419
原创 三级缓存实现
在Java应用中整合Nginx、Caffeine和Redis构建三级缓存架构,能显著提升高并发系统的性能。下面是一个实用的实现方案。
2026-01-19 09:55:00
501
原创 监听mysql binlog日志
监听 MySQL 的 binlog 日志是实现数据库实时变更捕获的关键技术,广泛应用于数据同步、缓存更新和实时分析等场景。下面这张图汇总了实现此目标的完整流程和核心要点。下面我们来详细探讨每个环节的具体实施细节。
2026-01-16 09:42:33
655
原创 claude code
Claude Code 是由 AI 研究公司 Anthropic 开发的一款命令行人工智能编程助手。它将强大的大语言模型(如 Claude 3.5 Sonnet)直接集成到终端中,让你能够通过自然语言指令来完成代码编写、调试、重构、项目分析等复杂的开发任务,旨在成为在命令行中与你协同编程的智能伙伴。为了帮助你快速建立整体认知,下面这个表格汇总了其核心定位与价值。特性维度Claude Code传统IDE插件(如Copilot)交互界面终端(CLI)图形化界面(GUI)工作模式“代理型”助手:可接受
2026-01-16 09:04:55
1316
原创 事务消息实现
梳理出一份清晰、可操作的RocketMQ事务消息实现指南。下面这个表格汇总了实现事务消息的四个核心组件及其职责,可以帮助你快速建立整体认知。核心组件主要职责关键配置/方法发送半消息,并触发本地事务执行:执行本地事务(如数据库操作)和响应Broker的状态回查接口,实现和方法订阅并处理已提交的事务消息, 需实现逻辑通过注解和模板简化配置。
2026-01-06 18:49:30
458
原创 数据库连接池耗尽原因
总而言之,连接池耗尽本质是“供需失衡”:对连接的需求(高并发、慢操作)超过了连接池的供给能力(最大连接数限制)。排查时需从应用代码(泄漏)、配置(参数)、数据库(性能) 三个方面系统性地入手。希望这份详细的剖析能帮助您有效定位并解决连接池耗尽的问题。如果您在具体的排查过程中遇到困难,比如有特定的错误日志或监控图表,我很乐意协助您进行更深入的分析。
2025-11-28 14:40:07
414
原创 创建es索引
总的来说,在 Kibana 中通过 Dev Tools 使用 Elasticsearch API 创建索引是核心方法。关键在于根据数据特性和应用需求,合理规划索引的settings和mappings。希望这份指南能帮助你顺利上手!如果你在具体操作中遇到更细致的问题,例如对某个字段类型的选择有疑问,我们可以继续深入探讨。
2025-10-28 14:48:03
459
原创 es查询操作
掌握 Elasticsearch 查询的关键在于理解其 DSL 结构和核心查询类型的适用场景。对于复杂的业务逻辑,bool查询是您最得力的工具。此外,善用filter上下文可以提高查询性能,因为过滤条件不计算分数且结果可缓存。希望这份指南能帮助您更好地使用 Elasticsearch!如果您能分享您具体的数据结构和查询需求,我可以尝试提供更具体的查询语句示例。
2025-10-28 13:56:57
1090
原创 QLExpress 解析方程式
总的来说,QLExpress 是阿里系处理方程式和复杂逻辑解析的核心依赖。它通过将表达式从代码中解耦,赋予应用强大的动态执行能力和高度的灵活性,特别适合业务规则多变、对计算精度有高要求的场景。希望这些信息能帮助你更好地理解阿里的方程式解析技术。如果你对某个具体功能或应用场景有更深入的疑问,我们可以继续探讨。
2025-10-23 20:08:30
522
原创 exp4j并发解决
总的来说,让 exp4j 应对高并发的关键在于 “减少重复工作、管理好对象生命周期、避免资源竞争”。对于大多数应用,实施表达式缓存方案已经能带来显著的性能提升。如果您的系统属于计算密集型且QPS要求极高,可以考虑结合对象池化和异步限流等更高级的策略。希望这些具体的分析和建议能帮助您优化基于 exp4j 的应用性能!如果您在具体实施中遇到其他问题,欢迎随时提出。
2025-10-17 14:53:05
433
原创 JEP、exp4j和Expression4j解析公式对比
在Java项目中解析数学表达式时,JEP、exp4j和Expression4j都是常见的选择。它们各有侧重,下面的对比表格可以帮你快速把握它们的核心区别。特性对比功能全面的解析器、高性能的表达式求值器的表达式框架。支持复数、向量、布尔逻辑等复杂数据类型和大量内置函数。。专注于核心数学运算,支持自定义函数和变量。。支持实数、复数及高度自定义的语法和函数。相对重量级,资源消耗稍大(约50KB),无外部依赖,性能出色。
2025-10-17 14:52:23
590
原创 java解析公式模型
对于快速原型、简单脚本或内部工具,且不想引入额外依赖时,可考虑使用内置的脚本引擎。对于大多数正式项目,特别是对性能、安全性有要求的Web应用或服务,强烈推荐使用专业的表达式解析库,如exp4j。只有当公式绝对固定、性能要求极高且动态性不是需求时,才考虑硬编码方式。通常,将公式存储在数据库中是常见的做法,应用运行时从库中取出公式字符串,再使用上述方法(特别是exp4j)进行计算,这样可以实现公式的动态配置,无需修改代码。
2025-10-16 19:58:58
358
原创 单线程拉取消息 + 自定义线程池处理消息,出现线程池超载解决
面对线程池超载,你可以按以下步骤排查和解决:紧急止血:立即调整线程池参数(增加线程数、队列大小),并将拒绝策略设置为。深入分析:监控系统资源和使用情况,定位性能瓶颈是在CPU、IO还是外部服务。根本优化:优化业务处理逻辑,评估并调整Kafka Topic的分区数,建立完善的监控告警体系。权衡取舍:清醒认识此模式对消息顺序性的影响,并谨慎实现偏移量提交逻辑,确保数据的可靠性。希望这些具体的步骤和建议能帮助你有效解决线程池超载的问题。
2025-10-10 15:20:15
893
原创 实时数仓历史数据优化
优化实时数仓的历史数据分表方案,本质上是围绕业务场景在查询性能、存储成本、数据时效性三者之间找到最佳平衡点。建议你从以下几个方面评估自己的需求:数据特性:你的历史数据有多大?冷热分布如何?更新频率怎样?查询模式:业务方是更倾向于查询最新状态的数据,还是需要深度回溯历史明细?常见的查询维度是什么?技术储备:团队对哪种技术栈更熟悉?运维能力如何?希望这些思路能为你提供有价值的参考。如果你能分享更多关于你的具体业务场景,或许我可以提供更聚焦的建议。
2025-10-09 19:26:55
305
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅