- 博客(85)
- 收藏
- 关注
原创 不是在构造方法「之前」修饰 Bean、注入;是构造方法跑完之后,才做属性注入,再跑 @PostConstruct。
java运行👉是才注入的,所以必须放到里面去 new template;然后回答你的后半句:然后构造方法后调用事务方法的时候使用?✅ 这点是对的: 等整个 Bean 初始化完成,后续业务方法(比如你那个清理 delete 的方法)被调用时,直接拿已经初始化好的去执行编程式事务。
2026-10-29 15:43:06
138
原创 Swagger 库的渲染核心流程是:加载静态资源 → 请求获取 OpenAPI 规范 JSON → 解析规范 → 动态生成交互式 HTML 界面。它本质是一个前端项目,把后端生成的接口描述数据
。它本质是一个前端项目,把后端生成的接口描述数据“翻译”成可浏览、可调试的文档页面。。
2026-10-23 16:42:09
181
原创 EXISTS 是遍历左边,左边每一行,都去右边做一次匹配判断
逻辑流程:上面是SQL 语义逻辑。 OceanBase 优化器,在很多场景下会自动改写,把 EXISTS 转成【半连接 semi join】,底层实际执行计划不一定真的循环多次查表,性能会优化。 但是你写的这条 SQL 的业务逻辑含义,仍然是上面说的逻辑。
2026-10-14 13:50:08
169
原创 浏览器版本兼容异常处理方案(前端常见问题,Java 后端项目配套管理后台场景居多)常见场景:旧 IE、低版本 Chrome、360 兼容模式、旧 Edge 打开页面:样式错乱、JS 报错、功能点点击
User-Agent例子:IE11、Chrome 78、360 浏览器(兼容内核是 IE,极速是 Chromium)
2026-10-09 15:21:27
168
原创 MQ 三大核心目标:消息不丢失、解决消息堆积、消费不重复
不丢消息:生产者确认 + Broker 持久化 + 消费成功后手动 ACK不重复:业务幂等,用单据 wjId 做唯一判断不堆积:优化消费速度、限制重试、死信隔离,堆积时扩容消费端。
2026-10-09 14:16:39
203
原创 重置本地git
你要确认:本地的代码改动是否还需要保留?如果还有要保留的代码,,执行前确认本地改动不需要保留!,本地和远程 dev 完全一样。含义:把 HEAD 重置到。
2026-10-08 09:46:28
211
原创 Java Excel 导出
Excel 导出有三种方案:第一种 POI 的 SXSSF 流式,适合复杂样式;第二种阿里 EasyExcel,封装好、低内存,业务最常用;第三种 MQ 异步架构方案,用来处理百万级超大报表,避免同步接口超时、OOM。
2026-09-24 11:28:59
256
原创 芋道ruoyi
芋道不是 AOP、不是拦截器。它扩展 / 重写了 SpringMVC 的路由扫描器(RequestMappingHandlerMapping),启动的时候,自动去读取实现类所实现接口上的等 Web 注解,自动注册 MVC 路由。于是一份接口契约,可以同时给 Feign 调用方、MVC 服务提供方两边共用。如果你想,我可以写一份极简的 SpringBoot 小 demo,自己实现这个「读取接口上 PostMapping 自动注册路由」的核心代码(几十行),看明白底层原理。
2026-09-22 13:46:49
147
原创 new Gson() 和 GsonBuilder().registerTypeAdapter(...).create() 得到的都是 Gson 对象,都可以调用 toJson ()。区别不是 “有参
new Gson()完全够用。RPC 报文里面包含ClassClass[]字段,必须用 GsonBuilder 注册自定义适配器,生成装配好规则的 Gson 实例。不是 toJson 调用的时候传参数,是构建 Gson 工具对象的时候,提前装好特殊类型的处理逻辑。
2026-08-10 17:18:32
198
原创 ChannelInboundHandler
等着网络主动推送消息、连接状态通知,被动接收;里面可以手动调用 write 主动发起发包;不负责 “触发发送”,而是所有往外发的数据、连接、关闭动作必经的拦截加工节点,做编码、协议封装、监控、拦截控制,是 Netty 分层架构必不可少的一环。
2026-08-08 17:41:19
217
原创 阿姆达尔定律(Amdahl‘s Law)
程序里串行跑不掉的代码,是性能的天花板;不要盲目堆线程、堆 CPU 核心,优先优化串行瓶颈(锁、同步阻塞、单线程繁重计算)收益最大;并行部分占比越高,多核优化收益越明显;串行占比越高,多核基本白费。
2026-08-01 19:17:16
307
原创 单纯 casTabAt(tab,i,null,new Node()) 是单步原子操作没问题,但没法保护中间一段多步逻辑computeIfAbsent
单纯 CAS 只能原子替换数组引用,但拦不住多线程同时执行你传入的创建对象 lambda;先用 CAS 塞入 ReservationNode 占位 + 同步锁,才能保证创建逻辑全局只执行一次,避免重复创建无用对象。
2026-07-28 00:32:36
196
原创 为什么 JIT / CPU 要把「赋值」提前到「构造初始化」前面?
构造初始化是耗时操作,引用赋值是极快的简单写指令;JIT/CPU 为填满流水线、减少阻塞,优先执行轻量存储指令;单线程不会出现提前访问引用,符合 as-if-serial 语义,优化合法;多线程无锁读取路径暴露了这个重排序漏洞,因此 DCL 必须加 volatile。
2026-07-15 01:32:20
160
原创 二叉树 & 多叉树 完整总结 + 举例用法
普通二叉树满二叉树完全二叉树二叉搜索树 BSTAVL 平衡二叉树红黑树哈夫曼树B 树B+ 树B* 树Trie 字典树N 叉树。
2026-05-13 17:28:21
355
原创 奖池渲染以及中奖逻辑
│ 主奖池ID: "3" │。│ 后端: 返回中奖结果 │。│ 后端: 将可用奖品ID缓存到Redis │。│ 后端: 确定用户所属的主奖池 │。│ 后端: 遍历主奖池的每个奖品 │。│ 后端: 从Redis获取缓存的奖品ID列表 │。│ ⚠️ 注意: 这里不再查询备用奖池!
2026-05-13 10:49:14
293
原创 Collection单列集合、Map(Key - Value)双列集合,多继承实现。
Collection→ 单列:单个元素Map→ 双列:key-value 键值对Map 和 Collection 完全平级,没有任何继承关系entrySet()就是把每一组键值对封装成Map.Entry。
2026-04-28 10:42:22
90
原创 一、核心答案isEmpty() 是 Java 中 集合、字符串、队列、栈、Map 等容器类的公共成员方法作用:判断当前对象是否为空1. 你刷题常用的(栈 / 队列)java运行// Deq
Collection 体系List / Set / Queue / Deque / 栈实现类 → 都有Map 体系HashMap、Map 所有实现类 → 都有String单独自带 isEmpty ()数组 ❌ 没有 isEmpty ()数组只能手写判断。
2026-04-25 16:24:15
59
原创 LinkedHashMap 底层天生自带 LRU 能力,几十行就是标准 LRU,不用自己写链表、HashMap。
底层自带HashMap + 双向链表构造器第三个参数 accessOrder=true开启 LRU 访问排序重写,判断容量超限自动删最久未使用所以代码极简,是 Java 最快写出来的标准 LRU。
2026-04-24 14:50:20
210
原创 redis命令集合
适合存对象(比如用户信息、商品信息),一个 key 下多个字段。带权重的集合,适合做排行榜、延时队列,按分数排序。最常用的缓存类型,存普通文本、JSON、数字。适合做队列、消息推送、消息列表,有序可重复。无序、不重复,适合做标签、去重、好友关系。
2026-04-23 15:33:29
91
原创 环境资源配置路径自定义设置dev、prod
- 确保此配置存在且未被覆盖 -->根据不同的环境,把对应文件夹里的配置文件打包-->--打包时先排除掉两个文件夹-->-- 开发环境 -->-- 生产环境 -->
2026-04-21 09:47:56
49
原创 生命周期 = Vue 实例从创建 → 挂载 → 更新 → 销毁的全过程钩子函数computed = 基于依赖缓存的计算属性
computed 不属于生命周期钩子,只是和生命周期一起执行依赖缓存、用到才计算、必须 return生命周期核心:created(拿数据)、mounted(操作 DOM)、beforeDestroy(清理)
2026-04-11 12:52:06
302
原创 :: 既可以引用静态方法,也可以引用普通成员方法(对象方法),只是规则不一样。
静态方法:类名::方法对象方法:对象::方法任意对象调用:类名::成员方法不是必须静态,只是你现在用的 reduce 场景刚好适合静态方法而已。
2026-04-06 15:35:52
40
原创 Java 的 reduce 和 Vue/JS 里的 reduce 功能思想一模一样,只是语法、位置、用途场景不一样。
求和、求最大、求最小、拼接、统计数量…… 全都一样。
2026-04-06 15:28:10
65
原创 原生 JS:数据和视图「分离」,必须手动同步原生 JS 里,数据是数据,视图是视图,两者完全没关系
原生 JS:数据改了,视图不会自己变,必须手动写代码把数据「写」进视图里。Vue:数据改了,视图自动跟着变,因为 Vue 在数据和视图之间搭了一座「自动同步的桥」。
2026-04-05 19:25:39
105
原创 用 String.intern() 做细粒度锁,在生产高并发场景下,100% 会产生字符串常量池内存泄漏 / 内存溢出(OOM)这正是大厂绝对禁止用 intern() 做业务 ID
intern()常量池只增不减 → 内存泄漏 → 服务宕机intern()会让常量池只增不减,造成内存泄漏,生产绝对不能用!替代方案是标准细粒度锁实现核心保证锁住对应 ID(和intern()效果一致)空闲锁自动清理(无内存泄漏)排序防死锁状态机 / 转账场景完美适配。
2026-03-28 21:52:50
250
原创 Collection(单列集合)、Map(双列集合),容易搞混的 Collections 工具类。
表格维度Collection 单列集合Map 双列集合存储格式单个元素E键值对K-V结构一条线两条线绑定根接口CollectionMap遍历方式直接遍历元素遍历 key 或 entry元素规则可重复(List)/ 不可重复(Set)key 不可重复方法体系。
2026-03-28 12:58:43
247
原创 虚引用(PhantomReference):堆外内存的“送葬者”,弱引用(WeakReference):随时可丢弃的“临时工”,
(虚引用)和(弱引用)。彻底把这两个概念钉在脑子里,做一个。
2026-03-25 22:01:37
64
原创 “等的时候用虚拟(线程),算的时候用池(线程池)。”
计算型的时候还是池化技术通过空间换时间更好”,这里的“空间换时间”用得非常精妙。我们可以把这个逻辑再深化一下,看看为什么在计算场景下,传统的线程池(空间限制)反而能换来更好的执行效率(时间)。
2026-03-25 00:29:09
262
原创 [特殊字符] 正常部署 AI + 流式输出(Stream)[特殊字符] 为什么会 CPU 炸了?
只要加 2 个 JVM 参数 + 一行 limitRate (1),就绝对不会爆 CPU!→ 必然占资源你只用。,CPU 立刻正常!
2026-03-24 22:28:24
85
原创 GOF 的全拼是 Gang of Four,中文常译为四人组或四人帮
Gang of Four 指四位合著经典著作《Design Patterns: Elements of Reusable Object-Oriented Software》(《设计模式:可复用面向对象软件的基础》)的作者:他们在书中系统总结了23 种经典设计模式,成为面向对象设计的里程碑,因此这 23 种模式被称为 GOF 设计模式。GOF =,一共。
2026-03-22 21:18:40
430
原创 观察者模式
观察者模式 = 状态一变,自动广播通知,所有订阅者自动执行!你现在彻底懂了吧!我可以再给你写一个SpringBoot 版观察者模式,更贴近你项目!
2026-03-22 21:13:41
67
原创 Redisson 大量用了 Lua
Redis + Lua = 原子操作基础Redisson = 分布式锁完整实现 + 生产级可靠性简陋小作坊标准化工厂。
2026-03-14 20:34:16
94
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅