- 博客(37)
- 收藏
- 关注
原创 策略模式怎么实现,bean是在什么时候注入的
摘要:策略模式是SpringBoot项目中消除if-else代码的优雅方案。文章以HR系统薪资计算为例,展示如何:1)定义SalaryStrategy接口;2)实现不同员工类型的策略类(@Service注解);3)通过@Autowired自动注入Map<String,SalaryStrategy>构建策略工厂;4)在业务层无if-else调用。关键点在于Spring启动时自动扫描策略类,创建实例并注入Map,其中Key为Bean名称。这种方案扩展性强,新增类型只需添加策略类,符合开闭原则。文中还
2026-06-29 12:08:09
373
原创 Redisson 和redis 实现延迟消息
Redis是内存数据库服务端,提供基础数据结构支持;Redisson是基于Redis的Java客户端框架,封装了分布式工具。Redis提供String、Hash、List等基础能力,而Redisson在其基础上实现了分布式锁、延迟队列等高级功能。Redisson延迟队列采用ZSet+List实现,通过后台线程扫描到期任务,比Redis原生Key过期监听更可靠。实际项目中应优先使用Redisson提供的分布式组件,避免直接依赖Redis的不稳定特性。
2026-06-11 23:13:36
256
原创 延时消息的几种实现方式及优缺点
本文对比分析了三种实现延时任务的方案:定时任务轮询、Redis Key过期监听和MQ延时队列(RabbitMQ/RocketMQ)。 定时任务轮询可靠性高但时效性差(分钟级),适合非核心场景;Redis Key过期监听实现简单但存在消息丢失风险,仅适用于允许丢消息的非核心业务;MQ延时队列兼具高可靠性和秒级精度,其中RocketMQ原生支持延时消息,是电商等核心业务的首选方案。 综合建议:非核心场景用定时任务,临时场景可考虑Redis,核心业务优先选择MQ方案(特别是RocketMQ)。
2026-06-11 21:55:29
555
原创 Git 提交信息命名规范:feat、fix、refactor
本文介绍了Git提交信息的规范格式Conventional Commits,强调规范的提交记录对团队协作的重要性。提交信息应包含三部分:type(提交类型,如feat/fix/refactor等)、scope(影响模块)和subject(具体说明)。文章详细说明了各部分的书写规则,提供了常见模板和实际项目示例,并建议尽量使用scope提高可读性。规范的提交信息能清晰展示改动类型、影响范围和具体内容,便于后续问题排查和版本管理。
2026-05-18 17:08:24
618
原创 MyBatis-Plus 分页 Page 对象
MyBatis-Plus的Page<T>是标准分页对象,包含5个核心字段:current(当前页码)、size(每页条数)、records(当前页数据)、total(总记录数)和pages(总页数)。使用时只需创建Page对象并传入页码和页大小,框架会自动执行分页查询、计算总页数并封装结果。该分页方案简化了开发流程,无需手动编写count查询和分页计算,保持前后端交互字段统一,适用于各类分页场景,具有规范统一、可读性强的优势。
2026-05-14 14:29:45
190
原创 MyBatis-Plus 分页查询@Param 注解
SpringBoot+MyBatis-Plus分页查询参数使用规范:对于多参数方法,业务参数必须添加@Param注解以便XML识别,而MyBatis-Plus的分页Page参数由框架自动处理无需注解。具体规则为:1)单参数可不加@Param;2)多参数中业务查询对象必须加@Param("别名"),否则XML无法识别参数名;3)MyBatis-Plus的分页Page参数作为特殊对象会被自动处理,无需也不应该添加@Param注解。这种设计既保证了框架的灵活性,又简化了分页场景下的编码工作。
2026-05-13 10:54:30
352
原创 MySQL 中 KEY 的使用
MySQL索引类型区别总结: KEY/INDEX是普通索引,仅加速查询,不保证唯一性; UNIQUE KEY是唯一索引,兼具加速查询和防止重复的功能; PRIMARY KEY是主键,具有唯一性、非空性,且自动包含索引功能。 使用建议: 业务唯一字段应使用UNIQUE KEY而非普通KEY; 主键字段无需额外建立索引; 联合索引遵循最左前缀原则,避免重复建立子集索引; 索引不是越多越好,重复索引会增加维护成本。 核心区别:普通索引只管查询加速,唯一索引还能防重,主键则是表的唯一标识。根据业务需求选择合适的索引
2026-05-11 16:01:58
556
原创 Java 枚举:code/desc 设计、底层原理、MyBatis-Plus 数据库映射
本文介绍了业务枚举在Java开发中的最佳实践。针对传统硬编码的痛点,提出使用枚举替代魔法数字的方案,详细解析了标准业务枚举结构(包含code和desc属性)及其底层实现原理。文章还展示了如何封装通用枚举工具方法,并结合MyBatis-Plus实现数据库映射,最后总结了开发规范:所有业务状态都应使用枚举,固定设计code+desc双属性,禁止使用ordinal(),必须开启autoResultMap实现自动映射。通过枚举可提升代码可读性、统一约束、便于维护,是企业级开发的标准写法。
2026-05-11 15:03:32
338
原创 Java 8+ 时间类型 :从 LocalDateTime 到 Instant
本文介绍了Java 8引入的java.time时间API,主要包含四类核心时间类型:1)无时区的本地时间(LocalDate/LocalTime/LocalDateTime);2)带时区的时间(OffsetDateTime/ZonedDateTime);3)机器时间戳Instant;4)时间间隔(Period/Duration)。这些类型采用领域驱动设计,具有不可变性、线程安全性和语义清晰的特点。文章详细说明了各类别的适用场景,并提供了格式化转换、开发避坑指南和企业级最佳实践建议,强调应根据业务需求选择合适
2026-05-08 15:30:12
389
原创 MySQL 建表语句:反引号、单引号使用全解
本文分析了MySQL建表语句中反引号(``)和单引号('')的正确使用场景。反引号用于包裹数据库标识符,仅在字段名/表名为保留关键字、包含特殊字符或纯数字命名时必须使用;而单引号用于包裹字符串常量、注释内容,在字符类型默认值和注释时必须添加。文章通过实际业务表示例,展示了去除多余反引号的优化写法,并提出了命名规范建议:常规开发应采用小写字母加下划线的命名方式,避免滥用反引号;同时强调字符类型默认值必须使用单引号包裹。最后总结了两者的核心区别和使用口诀,帮助开发者编写规范、兼容性强的SQL语句。
2026-04-29 11:19:15
365
原创 MyBatis-Plus 分页查询两种实现方案
本文介绍了两种MyBatis-Plus分页实现方案:1)基于ThreadLocal封装的PageUtils工具类分页,适用于老项目改造,无需修改原有代码;2)MyBatis-Plus原生IPage分页(官方推荐),适合新项目开发,代码简洁规范。两种方案的核心区别在于:PageUtils通过工具类自动封装分页结果,对代码无侵入;IPage则通过原生分页对象直接返回完整分页信息。建议新项目采用IPage方案,老项目保持PageUtils实现,且同一项目应统一分页方案以避免风格混乱。
2026-04-16 10:46:55
345
原创 URI和URL分别是什么,有什么关系
URI是统一资源标识符,用于唯一标记资源(如身份证号);URL是统一资源定位符,属于URI的子集,能直接访问资源(如家庭住址)。在开发中,URI是抽象路径(如/order/create),而URL是带协议的完整地址(如http://localhost:8080/order/create)。所有URL都是URI,但反之不成立。实际编程时,我们使用的"接口地址"和"网址"都是URL,它们既能标识资源又能被直接访问。简言之:URI是资源的名字,URL是可访问的地址,开发中主
2026-04-14 17:42:25
205
原创 Wrappers 是什么?怎么用?
摘要:MyBatis-Plus的Wrappers工具类提供LambdaQueryWrapper、QueryWrapper和LambdaUpdateWrapper三种条件构造器,支持链式调用构建查询条件。LambdaQueryWrapper采用实体类方法引用方式,避免字段名错误,支持等值、范围、模糊、空值、排序等查询,并可通过布尔参数实现动态条件拼接。其中eq/ne用于等值判断,gt/lt用于比较,between处理范围,like实现模糊查询,in处理集合条件,orderBy实现排序。企业开发推荐使用Lamb
2026-04-14 17:01:33
445
原创 Maven 核心配置全解:从初始 pom 到私服配置,吃透 repositories 与 pluginRepositories
摘要:Maven项目的pom.xml默认不配置仓库,直接使用中央仓库。核心配置包括:dependencies声明业务依赖,repositories指定依赖下载地址,pluginRepositories配置插件仓库。企业项目中通常配置私有仓库(如Nexus)存放内部jar包,同时可添加阿里云镜像加速公共依赖下载。纯净pom.xml只需包含modelVersion、GAV坐标等基本信息,是企业配置的基础。仓库配置策略遵循:内部依赖优先从私服获取,公共依赖从镜像仓库下载,确保安全性和下载速度。
2026-04-14 16:45:44
300
原创 Maven 内部 Jar 包私服部署 + 多模块父工程核心配置
企业私有Jar包上传与多模块管理指南 本文详细介绍了企业私有Jar包上传至Maven私服的全流程,包含两种上传方式: 源码项目一键部署(推荐):通过Maven命令自动打包上传 无源码手动上传:使用Maven手动上传命令 同时解析了Maven多模块项目管理核心: 父工程配置<packaging>pom</packaging>的作用 企业级多模块项目结构设计 父工程的三大核心功能:聚合子模块、统一依赖版本、复用插件配置 最后提供了业务项目依赖私有Jar包的实战流程,以及常见问题的解决方案
2026-04-14 11:03:31
641
原创 枚举类的构造方法 是怎么使用的
枚举构造方法的作用与原理 摘要:枚举构造方法不是用于手动new对象,而是为枚举常量初始化属性。当枚举类首次加载时,JVM会自动调用构造方法为每个枚举常量实例化,赋予其业务属性(如编码、描述等)。这种设计实现了三大优势:1)集中管理固定配置;2)消除硬编码;3)确保类型安全。典型应用场景包括支付类型、消息模板、订单状态等需要携带固定业务数据的枚举。通过getter方法可直接获取枚举常量属性,使代码更规范、易维护。构造方法的执行由JVM自动完成,开发者只需定义属性和构造逻辑即可。
2026-04-13 17:13:49
331
原创 @PostConstruct @PreDestroy结合 Bean 生命周期实战详解
摘要:本文详细解析了SpringBoot中@PostConstruct注解的核心作用与使用场景。该注解用于在Bean完成实例化和依赖注入后执行初始化逻辑,特别适用于支付系统、小程序等需要加载配置、启动定时任务的场景。文章通过支付超时任务初始化案例,展示了@PostConstruct与@PreDestroy的配对使用,并强调其在解决"构造方法中依赖为空"问题上的优势。同时对比了同类方案,指出该JDK标准注解具有更好的兼容性和简洁性,是SpringBoot中最推荐的业务初始化解决方案。
2026-04-13 16:21:01
586
原创 Java 守护线程(Daemon)全解析:原理 + 实战,彻底搞懂后台线程设计
摘要:Java中的守护线程(Daemon Thread)源于Unix系统的守护进程概念,指在后台默默运行、辅助主线程的服务线程。与用户线程(主线程)不同,守护线程具有依附性:当所有用户线程结束时,守护线程会自动终止。典型应用场景包括订单超时监听、日志收集等后台服务。设置守护线程(thread.setDaemon(true))可避免服务关闭时线程残留导致程序无法退出,但需注意不可用于关键业务(如事务提交)。该设计体现了"主仆关系"的线程管理思想,是Java后台服务的最佳实践。
2026-04-13 15:49:07
861
原创 Redisson 延迟队列实现订单支付超时自动取消(源码 + 原理全解)
本文介绍基于Redisson实现的Redis延迟队列方案,用于处理订单支付超时自动取消的业务场景。该方案通过Spring事务同步器确保订单事务提交成功后创建超时任务,避免数据不一致。核心组件包括任务实体、调度器、Redis队列和消费者,采用双队列设计(延迟队列计时+阻塞队列执行)和JSON序列化存储。方案采用后台线程阻塞监听而非监听器模式,这是Redis队列的标准实现方式。该轻量级方案适用于中小型电商系统的延迟任务场景,无需部署独立中间件,具有开箱即用、可靠性高的特点。
2026-04-10 12:07:06
552
原创 JSON格式请求体
JSON格式规范要点总结:1. 基本规则:键名必须双引号,支持6种数据类型(字符串/数字/布尔/null/对象/数组),键值对用冒号分隔;2. 三种标准格式:单层对象、带数组对象、多层嵌套对象;3. 语法铁律:键值对必须完整,值不能为空;4. 空值处理:必须明确用null或空字符串""表示,不可省略值;5. 常见错误:键值对缺少值会导致解析异常。正确使用JSON需严格遵守这些规范,确保数据可被正常解析处理。
2026-04-09 14:25:43
402
原创 Maven与Spring Cloud SpringBoot核心配置文件解析
pom.xml= 项目的菜篮子→ 装所有依赖、构建规则(Maven 工具)= 微服务的开机引导→ 管注册中心、配置中心(Spring Cloud)= 项目的运行设置→ 管端口、数据库、MyBatis、MinIO(Spring Boot)
2026-04-09 11:15:23
525
1
原创 请求头 Token 里的 Bearer 到底是什么?请求头请求体又是什么
HTTP请求报文由请求头和请求体组成,遵循固定顺序:请求头在前,请求体在后,中间用空行分隔。请求头包含元数据(如数据格式、长度、认证信息),请求体携带实际传输数据。GET请求通常无请求体,POST/PUT等请求则包含两者。认证接口需在请求头携带"Authorization: Bearer Token",其中Bearer是OAuth2.0/JWT认证的标准令牌类型标识,表示持有者凭据。这种结构确保服务端能先解析请求头获取必要信息,再处理请求体数据。
2026-04-03 10:52:11
240
原创 后端分页查询:为什么推荐用POST而非GET?
摘要: 在企业开发中,复杂查询(如订单分页)应使用POST而非GET,主要原因包括:1. GET不支持@RequestBody接收JSON参数;2. GET的URL参数长度受限且不适用于复杂条件;3. POST请求体更安全,避免隐私数据泄露;4. 符合行业规范(简单查询用GET,复杂查询用POST)。因此,订单分页等接口采用POST是正确且通用的做法。
2026-04-03 10:13:04
217
原创 SpringBoot 接口传参全攻略:新手必懂的查询参数 / 路径参数 / JSON 参数
本文系统讲解SpringBoot接口传参的核心知识点,涵盖三种标准传参方式:URL查询参数(自动封装DTO)、路径参数(@PathVariable)、JSON请求体(@RequestBody)。重点区分了DTO自动封装与@RequestParam的区别,强调GET请求不使用JSON的铁律。通过省市区联动接口的实战案例,展示如何设计多级查询接口,包括参数传递、层级判断和返回值设计。最后总结了新手常见问题和必背口诀,帮助开发者快速掌握规范化的接口开发方法。
2026-03-25 19:25:23
491
原创 登录方式:JWT(JSON Web Token), Session + Cookie 和 Opaque Token(不透明令牌/引用令牌)
本文通过游乐园的比喻形象解释了三种认证机制:Session+Cookie(记名手环)、OpaqueToken(寄存牌)和JWT(防伪门票)。从载体、存储位置、服务器压力等维度对比了三者差异,重点分析了JWT的流程和潜在问题:注销困难(建议黑名单或版本号机制)、信息过大(只存核心数据)、泄露风险(短效Token+HTTPS)。指出JWT不适合极度敏感系统、单体应用和带宽敏感场景,建议现有JWT项目检查敏感信息、过期时间设置,必要时实现RefreshToken机制。
2026-03-25 17:15:41
517
原创 IP、端口、接口、DNS 到底是什么关系?
本文通过快递送货的类比,形象解释了IP地址、端口和接口三者的关系:IP地址是设备唯一标识(如城市住址),端口是服务门牌号(如小区门牌),接口是业务功能入口(如家中窗口)。三者层级递进:先通过IP找到机器,再通过端口定位服务,最后通过接口访问具体功能。文章详细解析了三者的定义、分类及作用,并结合开发场景(如Apifox接口测试、IDEA远程调试)说明其联动关系,最后总结了三者的本质区别与数量关系,并给出排查网络问题的实用建议。
2026-03-19 11:12:54
665
原创 SPA MPA CSR SSR他们的优缺点以及相互之间的联系
本文对比分析了前端开发的三大核心维度:架构模式(SPA vs MPA)、渲染方式(CSR vs SSR)及其组合演变。传统MPA+SSR组合(如JSP/PHP)适合内容型网站,但交互体验差;SPA+CSR(React/Vue)提升用户体验但SEO差;现代同构方案(SPA+SSR)如Next.js/Nuxt.js融合了两者优势,首次访问SSR保证SEO和首屏速度,后续交互转为CSR保持流畅。选择方案需权衡SEO需求和交互体验:无SEO要求选SPA+CSR,传统内容站选MPA+SSR,现代官网推荐SPA+SSR
2026-03-19 10:54:53
469
原创 git团队协作开发流程 git rebase与git merge
团队协作开发的核心流程是:1. 初始化克隆项目(git clone) → 2. 创建功能分支(git checkout -b)开发 → 3. 日常提交(git add/commit) → 4. 推送前同步主分支(git pull) → 5. 推送功能分支(git push) → 6. 发起Pull Request进行代码审查与合并。关键原则是隔离开发环境,避免直接修改主分支。常见问题包括代码冲突(需手动解决)、推送失败(先拉取最新代码)和本地环境混乱(可用git restore或stash恢复)。协作方式建
2026-02-09 22:53:33
1451
原创 事务 (Transaction) 和 回滚 (Rollback)
事务是一组不可分割的SQL操作集合,具有ACID特性(原子性、一致性、隔离性、持久性)。Spring通过@Transactional注解管理事务,利用AOP代理机制在方法执行前后开启和提交/回滚事务。当异常发生时,Spring代理会捕获异常并调用rollback(),数据库则通过UndoLog执行反向操作恢复数据。需注意Spring默认仅对RuntimeException回滚,建议显式指定rollbackFor=Exception.class处理所有异常。整个事务处理涉及Spring代理拦截和数据库Undo
2026-02-04 13:51:27
798
原创 redis中String和zset的底层数据结构详解
Redis底层数据结构深度解析:String采用SDS实现,具有O(1)长度查询、二进制安全等特性,根据长度使用int/embstr/raw三种编码;ZSet则采用ZipList/SkipList+Dict的混合结构,兼顾内存效率与查询性能。SkipList作为ZSet核心,通过多级索引实现O(logN)复杂度,相比红黑树更易实现且范围查询更优。Redis通过智能编码切换和结构组合,在内存效率与操作性能间取得平衡,体现了其作为高性能KV数据库的设计精髓。
2026-02-03 22:44:45
781
原创 垃圾回收算法GC
Java垃圾回收机制可分为基础算法和具体实现两大层次。三大基础算法包括:标记-清除(易产生碎片)、标记-复制(适合存活率低的年轻代)、标记-整理(适合老年代但耗时)。JDK中的具体回收器(如Parallel、CMS、G1、ZGC)根据分代特性组合这些算法:年轻代主要采用标记-复制,老年代则选用标记-清除或标记-整理。JDK版本演进反映了GC发展历程:JDK8默认ParallelGC注重吞吐量,JDK9-11转向G1实现可控停顿,JDK17+的ZGC通过着色指针技术实现亚毫秒级停顿。不同回收器在STW策略、算
2026-02-01 21:28:58
874
原创 什么是 RESTful?
摘要:RESTful是一种基于HTTP协议的软件架构风格,其核心思想是将网络资源抽象化,通过标准HTTP方法(GET/POST/PUT/DELETE)进行操作。主要特征包括:URL仅包含名词表示资源、HTTP方法定义操作、无状态设计。相比传统RPC风格接口,RESTful通过/users/1形式的URL和对应HTTP方法实现CRUD操作,使接口更规范统一。在Java实现中,使用Spring MVC的@RestController、@GetMapping等注解,配合ResponseEntity返回状态码和JS
2026-02-01 14:42:48
1822
原创 5. GET 和POST 的区别
GET和POST是HTTP请求的两种基本方法,主要区别体现在:1)作用不同:GET用于获取资源,POST用于提交/修改资源;2)参数位置:GET参数在URL中,POST在请求体中;3)安全性:POST相对更安全;4)数据长度:GET受限,POST无限制;5)缓存特性:GET可缓存,POST默认不缓存。GET请求参数可通过QueryString或PathVariable传递,适合幂等操作;POST请求则适合非幂等操作,如提交表单数据。开发者应根据实际需求选择合适的方法。
2026-01-27 23:57:49
381
原创 哈希(Hashing)究竟是什么,为什么这么多地方都提到了哈希
哈希摘要 哈希是一种将任意长度输入转换为固定长度输出的算法,建立数据内容到存储位置的直接映射,实现O(1)高效查找。核心应用是哈希表,通过数组和冲突解决策略(链地址法或开放寻址法)存储数据。进阶应用中,布隆过滤器通过位数组和多个哈希函数实现高效去重;一致性哈希优化分布式系统负载均衡;GeoHash将地理位置编码为一维字符串,支持邻近查询。哈希的四大优势包括极速查找、数据压缩、均匀分布和单向隐匿。在Java中,重写equals()需同时重写hashCode()以保证哈希表正确性,而ThreadLocal采用开
2026-01-26 22:51:49
818
原创 java后端面试中经常涉及的JVM知识点
JVM核心知识点速览:内存模型分为线程私有区(虚拟机栈、本地方法栈、程序计数器)和共享区(堆、方法区)。垃圾回收采用可达性分析算法,主要算法包括标记-清除、标记-复制和标记-整理,常用收集器有CMS和G1。类加载采用双亲委派机制保障安全,流程包括加载、验证等7个阶段。OOM排查需生成堆转储文件,使用MAT等工具分析大对象和引用链。面试重点包括内存分区、GC原理、类加载机制及实际故障排查经验。
2026-01-26 10:51:04
863
原创 Spring MVC 全流程深度解析:从请求到响应的暗中流程
摘要:本文深入解析SpringMVC处理HTTP请求的核心机制。通过"米其林餐厅"类比,阐述DispatcherServlet、HandlerMapping等组件分工。详细拆解请求7个关键步骤:从拦截请求到响应返回,重点说明Controller业务处理和视图解析过程。同时指出前后端分离架构下ViewResolver被HttpMessageConverter替代的变化,并提示Controller单例模式的线程安全问题。文章揭示了SpringMVC通过组件化解耦实现高效请求处理的原理,为理解
2026-01-25 18:01:17
715
原创 Spring Boot 自动配置原理详解:告别 XML
SpringBoot自动配置机制解析:通过@EnableAutoConfiguration注解触发,利用AutoConfigurationImportSelector扫描META-INF/spring.factories或AutoConfiguration.imports文件获取候选配置类。采用@Conditional系列注解(如OnClass、OnMissingBean、OnProperty)实现按需加载,确保只有满足条件的配置类才会生效。该机制基于Java SPI和Spring条件装配,通过"
2026-01-25 16:39:01
1002
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅