- 博客(59)
- 资源 (3)
- 收藏
- 关注
原创 Redis 哈希槽(Hash Slot)与一致性哈希环(Consistent Hashing)核心对比
一致性哈希环:适合动态性强、节点频繁变动的场景(如缓存层),通过虚拟节点降低数据迁移成本。哈希槽:适合强调数据强一致性与集群管理的场景,通过槽位分片实现高效扩缩容。
2025-04-03 14:56:15
836
原创 Spring 中使用代理的注解及机制分析
代理触发条件:需确保目标类被 Spring 管理(如 @Component 扫描或手动注册)。同类调用问题:通过 AopContext.currentProxy() 或重构代码解决。代理类型选择:优先 JDK 动态代理(接口实现),强制 CGLIB 需配置 proxyTargetClass=true。
2025-03-17 11:08:22
1510
原创 Spring 扩展点总结与分析
明确阶段:根据业务需求选择最靠近目标阶段的扩展点(如修改 Bean 定义用 BeanFactoryPostProcessor 而非 BeanPostProcessor)。避免副作用:确保扩展逻辑不影响 Spring 原生生命周期(如 BeanPostProcessor 中避免过早初始化其他 Bean)。性能优先:高频扩展点(如 BeanPostProcessor)应减少阻塞操作,必要时采用懒加载或异步处理。兼容性:自定义扩展需考虑 Spring 版本差异(如 ApplicationContextIni
2025-03-16 17:28:45
1023
原创 spring 创建单例 Bean 源码分析
Spring Boot 2.6+ 默认禁止循环依赖以提升代码质量,开发者应优先通过设计消除依赖闭环。若需临时兼容,可通过配置文件或代码显式开启,但需明确此操作仅为过渡方案。
2025-03-15 16:26:05
969
原创 Java 中 getCanonicalName、getSimpleName、getName、getTypeName 的区别
getName() 关注 JVM 内部表示,getTypeName() 提供开发者友好的类型名(尤其对数组)。getCanonicalName() 严格遵循 Java 语言规范,适合生成代码或文档。getSimpleName() 用于简洁显示类名,忽略包和内部符号。
2025-03-14 20:36:46
515
原创 Spring 中 SmartInitializingSingleton 的作用和示例
SmartInitializingSingleton 是 Spring 中用于 全局单例初始化后置处理 的关键接口,适用于依赖全量 Bean 就绪的场景。其设计弥补了 InitializingBean 在全局性、顺序控制上的不足,是框架扩展与业务初始化的高效工具。
2025-03-14 19:49:49
734
原创 Spring 中 BeanPostProcessor 的作用和示例
Spring Boot 通过内置的 BeanPostProcessor 实现了丰富的企业级功能(如 AOP、事务、异步等),开发者也可通过自定义扩展灵活控制 Bean 生命周期。理解每个处理器的作用与执行时机,是优化 Spring Boot 应用架构的关键。
2025-03-14 17:29:32
838
原创 Spring 中 BeanFactoryPostProcessor 的作用和示例
BeanFactoryPostProcessor 是 Spring 容器级别的扩展接口,在 Bean 实例化之前,对 Bean 的配置元数据(即 BeanDefinition)进行动态修改或扩展。其核心功能围绕以下两点:修改现有 Bean 的定义(如属性值、作用域、初始化方法等)。添加新的 Bean 定义(需通过子接口 BeanDefinitionRegistryPostProcessor)。
2025-03-14 16:15:09
992
原创 Spring Boot 中 BootstrapRegistryInitializer 的作用与示例
BootstrapRegistryInitializer 为 Spring Boot 提供了启动初期扩展能力,适合需要早于容器初始化执行的底层逻辑。通过合理设计,可显著提升应用启动效率并解决模块化配置难题。
2025-03-14 14:31:00
761
原创 Spring 注解解析
@Transactional 通过 AOP 动态代理和 事务管理器实现声明式事务管理,开发者需关注传播行为、隔离级别、异常处理等核心属性,避免同类调用、非 public 方法等失效场景。在复杂场景下,结合编程式事务可提升灵活性和可控性。
2025-03-13 23:29:54
1139
原创 消息队列 Kafka、RocketMQ、RabbitMQ 对比与分析
Kafka:大数据领域事实标准,吞吐为王。RocketMQ:阿里系高可靠首选,平衡性能与功能。RabbitMQ:灵活轻量,适合协议多样化的中小系统。
2025-03-13 17:23:40
822
原创 设计模式在MyBatis中的具体应用与分析
设计模式应用场景关键实现工厂模式创建隔离复杂对象的创建逻辑,统一入口建造者模式解析XML构建对象分步处理复杂配置,支持多层级嵌套解析代理模式Mapper接口的动态代理解耦接口定义与SQL执行逻辑,实现无侵入式扩展装饰器模式缓存功能增强(LRU、日志、同步)动态扩展对象功能,避免继承导致的类爆炸问题模板方法模式SQL执行流程标准化(抽象公共逻辑,子类差异化实现具体步骤责任链模式插件机制(拦截SQL执行)通过动态代理链实现多插件的顺序执行设计模式的价值。
2025-03-13 09:59:39
821
原创 GOF设计模式在 Spring 框架中的核心应用分析
设计模式Spring中的实现核心作用工厂方法解耦对象创建与使用单例Bean作用域配置资源复用与状态共享代理AOP动态代理无侵入式功能增强适配器统一不同接口的调用方式模板方法封装通用流程,扩展细节观察者Listener松耦合的事件驱动机制策略动态切换算法实现结论:Spring框架通过灵活组合GOF设计模式,实现了高扩展性、低耦合的企业级开发框架。理解这些模式的应用场景,有助于掌握Spring的设计精髓,并在实际开发中借鉴其思想。
2025-03-12 20:56:36
879
原创 设计模式在 JDK 中的具体应用与分析
GOF 设计模式是面向对象设计中常见问题的可复用解决方案,通过 23 种经典模式 提供了一套标准化的设计思路,用于解决软件设计中反复出现的架构和交互问题。这意味着应该能够在不修改现有代码的情况下,让软件的行为发生变化(通常通过添加新代码来完成)2、使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。组合对象或类,形成更大结构的灵活方案,不破坏原有结构。1、上层模块不应该依赖底层模块,它们都应该依赖于抽象。2、抽象不应该依赖于细节,细节应该依赖于抽象。
2025-03-12 20:47:02
1118
原创 单点登录(SSO)中 OAuth 2.0、JWT、SAML 的对比与核心差异
OAuth 2.0是授权协议的首选,适合互联网应用和第三方集成。JWT 是轻量级令牌格式,适合无状态场景,常与 OAuth 配合使用。SAML是企业级 SSO 的成熟方案,适合复杂安全需求的内部系统。根据场景选择:开放生态用 OAuth,企业内网用 SAML,轻量级用 JWT。
2025-03-12 15:54:18
905
原创 细说 Java 集合之 Map
ConcurrentHashMap数据节点(hash值为非负数,通过方法spread计算):Node:链表节点;TreeNode:红黑树节点;辅助节点(不存放数据,hash值固定,且均为负数):TreeBin:用于指向红黑树根节点,hash值为-2;ForwardingNode:数组扩容时使用,hash值为-1;ReservationNode:占位节点,hash值为-3,方法computeIfAbsent 和 compute中使用该节点。
2025-03-02 23:59:39
802
原创 细说 Java 线程池
线程池状态(runStateOf)和线程池中线程数量(workerCountOf)一起存在了 ctl 成员变量中,通过高位掩码提取状态(runStateOf)、低位掩码提取线程数(workerCountOf)的位运算提高效率(相较于传统条件判断或锁操作)。
2025-02-28 22:23:46
1042
原创 细说 Java GC 垃圾收集器
几十MB的内存,使用Serial+Serial Old单线程进行回收;几百MB的内存,使用Parallel Scavenge+Parallel Old多线程的GC线程来回收;几个GB的内存,多线程也忙不过来,得使用并发的CMS+ParNew收集器;几十个GB内存,传统的垃圾收集器每次GC都需要对新生代或老年代或整个堆回收,这种STW时长是无法忍受的,此时就需要使用现代垃圾收集器了(如G1, ZGC),它们将内存划分为多个Region,每次回收计算ROI较高的Region。
2025-02-27 17:37:13
914
原创 细说 Java 引用(强、软、弱、虚)和 GC 流程(二)
GC扫描实例对象时,会通过一个叫做的类(C++写的),这个类里存放了我们java类的引用类型(基本类型不会存放)的成员变量;换言之,类里存在变量X,那就可以顺藤摸瓜找到X对象,否则,X就是不可达;我们的Reference类对应的类中就跳过了变量referent;实际使用时若我们在一个java类里定义了成百上千的引用类型变量,那岂不是也得存放成百上千的引用型变量,这还了得;所以为了避免这种情况,_offset:连续实例变量中第一个实例变量位置;_count:连续实例变量个数;注意。
2025-02-23 21:46:57
1006
原创 JVM层面的JAVA类和实例(Klass-OOP)
在HotSpot中,KlassKlassOopDescOopDescJVM 使用 C++ 编写的,C++ 定义了2个类KlassOopDesc分别用来描述Java中类和对象, 所以Java中的类和对象对于C++而言,均是 C++ 创建的对象。类比注解和元注解。C++定义的Java类产生的对象就是元注解;Java代码产生的对象就是注解。1、 JAVA代码通过创建对象,图示{1};2、JVM会加载对应的class,解析生成Klass对象,图示{2}、{3};3、JVM更加加载的Klass对象,创建。
2025-02-20 20:34:52
885
原创 细说Java 引用(强、软、弱、虚)和 GC 流程(一)
JDK1.2中引入了ReferenceWeakCacheFinalizerfinalize()前面三种引用我们编码时可以使用,也是我们所熟知的和是由 JVM 使用的,下面图片显示了类修饰符并非public。除此而外,平常编程使用new创建的对象均为。
2025-02-19 14:48:47
906
原创 Linux之【网络I/O】前世今生(二)
Linux中 I/O 多路复用的具体实现有:select、poll、epoll ;kueue 是在UNIX上比较高效的IO复用技术。
2025-02-14 10:22:59
1075
原创 Linux之【网络I/O】前世今生(一)
我们将不断的将传统I/O进行改进,将CPU拷贝次数逐步降低为0。我们把改进后的拷贝方式,统称为零拷贝(Zero-copy),官方定义如下:零拷贝是指计算机执行I/O操作时,CPU不需要将数据从一个存储区域复制到另一个存储区域,从而可以减少上下文切换以及CPU的拷贝时间。它是一种I/O操作优化技术。
2025-02-11 15:12:03
1002
原创 Linux之【磁盘 IO】前世今生
Page Cache 的维度,将 I/O分为 缓存I/O 和 直接I/O;进程阻塞阶段的维度,将 I/O 分为 阻塞I/O 和 非阻塞I/O;进程阻塞的维度,将 I/O 分为 同步I/O 和 异步I/O;
2025-02-08 19:17:26
759
1
原创 Linux之【内存管理】前世今生(一)
一个程序(如王者荣耀)平常是存储在硬盘上的,运行时才把这个程序载入内存,CPU才能执行。问题:这个程序载入内存的哪个位置呢?载入内核所在的空间吗?系统直接挂了。
2025-01-27 18:48:09
1413
原创 Linux之【文件系统】前世今生(一)
extfs,即Linux扩展文件系统,Ext2就代表第二代文件扩展系统,Ext3/Ext4以此类推,它们都是Ext2的升级版,只不过为了快速恢复文件系统,减少一致性检查的时间,增加了日志功能,所以Ext2被称为索引文件系统。
2025-01-17 21:24:16
1359
原创 计算机存储之图解机械硬盘
了解了机械硬盘读写数据的基本逻辑;知道了硬盘读写的最小单位是扇区(一般为 512 Byte);明白了顺序读写优于随机读写的原理和具体实践应用;懂得了硬盘存储 bit 的具体细节。
2025-01-10 19:17:26
1291
原创 深入理解计算机中的补码、反码、原码
为了使用加法替代加法,我们先后引入了补数、模、原码、补码、反码圆盘代表数字是有范围的,该范围的大小即为模,并且会首尾相连。计算机1 Byte、4Byte、8Byte天然会限定数据的范围。数据范围限定后,数据一直累计下去一定会产生数据溢出(即进位丢失),从而结束当前轮回,开始下一轮回;圆盘内的数字是原码,圆盘外的数字是补码,补码也是模内的无符号整数。注意,反码 + 1只是求得补码的一种方式,并非补码的定义;原码为0和正数时,原码等于反码等于补码;原码为负数时,反码为原码数据位按位取反。
2025-01-03 22:20:47
1356
原创 迷人的老祖宗之【天干地支】
早在商代的甲骨文中就已经有了六十甲子的记载,而现在我们都知道,在六十甲子中,“甲”为天干之首毫无疑义,但“子”为地支之首一直是有待商榷。”由此可鉴,虽然在阴干中“丁”不是排在第一位,但其烈性绝对是排在阴干的第一位,这也就可以很好的解释为什么“六丁”可以和“六甲”并列为神了。若用干支纪年法来称谓,一月称“建寅”之月,十二月称“建丑”之月,十一月称“建子”之月,这就是所谓的“三建”说。十天为一旬,三旬为一月。比方说,夏朝的夏历把一月作为岁首,商朝的殷历以夏历的十二月为岁首,周朝的周历以夏历的十一月为岁首。
2024-12-28 17:06:51
1136
原创 Java 引用是4个字节还是8个字节?
大部分 JVM 实现将 Java 引用(Ref)转换为机器指针(ptr);设置java堆内存范围为0~4GB时,java 引用为4字节即可保证正确寻址;设置java堆内存范围为4GB~32GB时, java通过指针压缩技术来保证4字节引用的正确寻址;设置java堆内存超过32GB时java通过8字节引用来保证正确寻址。
2024-12-26 21:42:33
991
原创 Java线程状态详解
特别注意每个状态上面注释,说明了哪些方法可以进入当前状态。NEW:调用后进入该状态;RUNNABLE:调用进入该状态;其它方式详见上面图示。BLOCKED:进入,等待获取锁时,进入该状态;WAITING:调用后进入该状态;TIMED_WAITING:调用后进入该状态;run()方法执行完毕,进入该状态。
2024-12-17 11:55:44
404
原创 字节码(一)
魔数值固定不变,且放在文件开头,JVM可以根据文件的开头来判断这个文件是否可能是一个.class文件,如果是,才会继续进行之后的操作。(3)主版本号(major version):61 (16* 3 + 13 = 61),意味着编译该文件的Java版本号为17。用UE或者其它16进制工具打开字节码文件,如下图所示:其中。(2)次版本号(minor version):0。
2024-12-12 15:54:14
220
ustc多核并行_上机实验报告_徐云(一共5次)
2015-07-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人