- 博客(33)
- 收藏
- 关注
原创 Spring MVC 请求处理流程详解
根据请求的 URL、参数、Header 等信息,找到对应的。对象将模型数据渲染到响应中(如生成 HTML、JSON)。负责调用处理器方法,并处理参数绑定、返回值转换。:在 Controller 内处理特定异常。(前端控制器)拦截,它是整个流程的入口。:在处理器方法执行前调用(如权限校验)。:拦截器、异常处理器、自定义参数解析器。:在处理器方法执行后、视图渲染前调用。:解析 Thymeleaf 模板。:全局异常解析器,自定义异常响应。:在请求完成后调用(资源清理)。:职责分离、组件化、高度可定制。
2025-04-14 22:33:44
434
原创 Spring Boot自动配置核心机制及工作流程详解
根据运行时条件(如类路径、Bean存在性、配置属性等)决定是否启用配置。定义配置逻辑,结合条件注解控制Bean的创建。检查所有条件,决定是否加载配置类或Bean。方法定义Bean,结合条件注解控制是否创建。Bean,则自动配置的Bean不会生效。:容器中无指定Bean时生效。加载所有符合条件的自动配置类。:应用条件注解筛选有效配置类。:类路径中存在指定类时生效。方法:加载并过滤自动配置类。检查类路径是否存在指定类。:存在指定配置属性且值为。方法:评估条件是否满足。指定配置类的加载顺序。
2025-04-13 17:31:46
748
原创 事务隔离级别详解
事务A查询某个范围的数据,事务B在期间插入或删除符合该范围的数据,导致事务A两次查询结果的行数不同。:事务A多次读取同一数据,事务B在期间修改并提交了该数据,导致事务A前后读取结果不一致。:事务A读取了事务B未提交的数据,事务B回滚后,事务A读取的数据无效。:行锁 + 间隙锁,防止其他事务在范围内插入新数据(解决幻读)。:不采用任何锁机制,直接读取最新数据(包括未提交的数据)。:事务修改数据时加排他锁(X锁),直到事务结束。:需要事务内多次读取一致的场景(如对账系统)。
2025-04-11 18:02:31
714
原创 Java中的基本数据类型
默认浮点类型,适用于高精度计算(如金融数值),可省略后缀或加。:节省内存的小范围整数存储,如文件处理或网络数据传输。:极大整数需求(如时间戳、唯一ID),需在数字后加。:需要小数的低精度场景(如科学计算),需在数字后加。:无明确规范(通常视为1位,但JVM可能占用更多):-2³¹ 到 2³¹-1(约-21亿到21亿):最常用的整数类型,适用于大多数计数和运算场景。:约±1.7e-308 到 ±1.7e308。:16位(Unicode字符):-2⁶³ 到 2⁶³-1。:32位(单精度浮点数)
2025-04-10 21:22:48
175
原创 分布式ID生成器设计详解
将机器ID高位表示机房编号,低位表示节点编号(如:2位机房 + 8位节点)。数据库不可用时,切换至Snowflake模式生成ID(牺牲趋势递增性)。预先从数据库批量获取ID号段,缓存在本地内存,减少数据库访问压力。本地内存缓存号段 + Redis缓存备份,防止数据库瞬时故障。数据库宕机时,依赖本地缓存继续分配ID,直至号段耗尽。部署NTP服务,并监控时钟偏差,偏差超过阈值时告警。多实例部署时,各实例独立缓存号段,避免竞争。:关闭时钟同步,依赖本地时钟(风险高)。:时钟回拨时等待或抛出异常,并记录告警。
2025-04-09 19:20:30
641
原创 Spring Boot 自动配置原理详解
的原则,根据项目依赖和上下文环境自动配置应用程序。:根据类路径、Bean存在性、配置属性等条件决定是否启用配置。:简化依赖管理和自动配置的整合。优先使用自动配置,必要时通过自定义 Bean 覆盖。编写自动配置类并使用条件注解控制生效逻辑。通过条件注解精确控制配置类的生效条件。Spring Boot 自动配置通过。,负责加载所有自动配置类。),筛选出符合条件的配置类。:触发自动配置的加载流程。定义的优先级加载配置类。参数,输出条件评估详情。键下的所有自动配置类。模式分析配置加载过程。
2025-04-08 17:02:54
1075
1
原创 int 与 Integer 的区别详解
Java 的 8 种基本数据类型之一,直接存储数值,:集合存储、数据库映射、API 接口设计(兼容空值)。的封装类,属于对象类型,提供面向对象的方法(如。警惕自动装箱的性能损耗,避免在循环中频繁使用。理解缓存机制,避免超出范围的对象重复创建。的高性能场景(如循环、数学运算)。:-128 ~ 127(可通过。对象会被缓存,复用同一对象。比较包装类时始终使用。
2025-04-07 20:04:13
352
原创 Java内存模型详解:堆、栈、方法区
理解堆、栈和方法区的结构与功能,是优化Java应用内存使用、排查内存泄漏和性能问题的关键。:新生代使用复制算法(Minor GC),老年代使用标记-清除/整理算法(Major GC)。:经过Minor GC存活的对象被转移到Survivor区,多次存活后晋升至老年代。:存储方法调用的栈帧,包含局部变量、操作数栈、动态链接和方法出口。:存储类信息、常量、静态变量、即时编译器优化后的代码。:永久代(PermGen),受JVM内存限制,易出现。:元空间(Metaspace),使用本地内存,通过。
2025-04-06 18:11:37
390
原创 HashMap 底层原理详解
链表查询复杂度 O(n),红黑树查询复杂度 O(logn),显著减少哈希冲突时的性能损耗。:预估元素数量,避免频繁扩容(如预计存 1000 元素,初始容量设为 2048)。JDK 1.7:遍历旧数组,重新哈希每个元素到新数组(头插法)。:元素数量超过阈值(容量 × 负载因子,默认 0.75)。:若链表长度 ≥8 且数组长度 ≥64,链表转红黑树。:若元素总数 > 阈值(容量 × 负载因子),触发。:旧容量 × 2(保证容量始终为 2 的幂次)。:数组 + 链表/红黑树,动态扩容优化性能。
2025-04-05 22:12:43
596
原创 动态代理(JDK Proxy vs CGLIB)详解
动态代理:在运行时动态生成代理类和对象,无需手动编写代理类,用于增强目标对象的功能。应用场景:AOP(日志、事务)、远程方法调用(RMI)、权限控制等。基于接口:要求目标对象必须实现至少一个接口。JDK 原生支持:无需引入第三方库,依赖 和 。定义接口: 2.实现目标类: 3.实现 InvocationHandler: 4.生成代理对象: JDK Proxy 的局限性 只能代理接口方法,无法代理类中未实现接口的方法。代理类继承自 ,无法多重继承。基于继承:通过生成目
2025-04-04 20:00:57
935
原创 Spring 如何解决循环依赖?
两个或多个 Bean 互相依赖对方,形成闭环引用(如 BeanA → BeanB → BeanA)。:构造器注入需在实例化阶段完成依赖注入,此时 Bean 尚未放入三级缓存,无法提前暴露引用。:通过工厂对象生成 BeanA 的早期引用(可能经过 AOP 代理),并将该引用放入。:通过反射调用构造器创建对象,此时 BeanA 的属性均为默认值(如 null)。:若 Bean 需要代理(如事务、AOP),早期对象可能是代理对象,由。:构造器注入无法使用三级缓存(实例化前需完成依赖注入)。
2025-04-03 22:12:03
965
原创 @Autowired 与 @Resource 的区别详解
注入策略(类型 vs 名称)、来源(Spring vs JSR)、灵活性(构造器支持 vs 无)。:属于 Java 标准,支持跨框架使用(如 Jakarta EE 环境)。:根据项目需求(强类型控制 vs 名称匹配)、框架兼容性、代码规范决定。:仅适用于 Spring 生态,与其他框架无直接兼容性。属性直接指定名称,未指定时先按名称再按类型查找。需要按名称注入且字段名与 Bean 名称一致。处理,按名称查找优先,依赖 JNDI 机制。需要构造器注入(强制依赖、不可变对象)。:Spring 框架原生注解(
2025-04-02 21:39:10
575
原创 IOC/DI 实现原理详解
答:ApplicationContext扩展了BeanFactory,提供更多企业级功能,且默认预初始化单例Bean。答:构造器注入需在实例化阶段完成依赖注入,此时Bean尚未放入缓存,无法提前暴露引用。填充BeanB属性时发现依赖BeanA,从三级缓存获取BeanA的工厂,生成早期引用并注入。:按依赖顺序创建Bean实例(默认单例且非延迟加载的Bean在容器启动时创建)。:IOC的实现方式,由容器动态注入对象所需的依赖,而非对象自行创建。:存放Bean工厂对象,用于生成早期Bean引用。
2025-04-01 19:26:02
806
原创 「值传递 vs 引用传递」
通过副本引用修改对象内容会影响原对象,但修改引用本身(指向新对象)不影响原引用。:对象传递的是引用值的副本,而非引用本身。方法内无法直接修改原引用指向的对象。无论是基本数据类型还是对象类型,传递的都是变量值的副本。:通过副本引用修改对象内容,原对象状态会改变。,传递的是引用地址的副本,而非对象本身)。是原引用的副本,指向新对象不影响原引用。的副本,重新赋值不影响原引用。,因为方法内交换的是副本引用。传递的是对象引用的副本(如。传递的是数据值的副本(如。:传递的是变量值的副本。
2025-03-31 20:05:40
362
原创 《Java全栈监控体系实战:从Micrometer到Grafana可视化大屏设计》
两大场景,结合Micrometer、Prometheus、SkyWalking等核心组件,系统化拆解Java全栈监控体系的构建与优化。"为什么线上服务CPU飙升却找不到根源?:业务指标(Biz)、技术指标(Tech)、系统指标(Sys)分离。限制标签值取值范围(如HTTP状态码仅保留2xx/4xx/5xx),助力实现从代码级洞察到业务全景可视化的完整监控链路。注解自动统计Controller耗时。:红(异常)、黄(预警)、绿(正常),避免高基数标签(如用户ID):全局状态→服务层→实例层。
2025-03-28 20:26:10
371
原创 《Serverless架构深度解析:从Knative到Spring Cloud Function实战》
两大场景,结合Knative Eventing与Spring Cloud Function源码,深度拆解Serverless架构的核心机制。"为什么Serverless能实现毫秒级计费?冷启动延迟如何从10秒优化到100毫秒?传统Spring应用如何零改造迁移到无服务器架构?:通过Spring Cloud Function Web适配层。建议使用GraalVM编译原生镜像优化启动速度。采用Knative多集群部署+统一事件总线。:对接Knative Eventing。:无请求时自动销毁实例(冷启动根源)
2025-03-27 22:49:34
392
原创 《云原生Java实战:从Kubernetes部署到Service Mesh架构演进》
"为什么Kubernetes需要Pod概念?Istio如何实现无侵入式流量治理?Java应用如何无缝过渡到Service Mesh架构?两大场景,结合Kubernetes Operator和Istio控制面源码,深入解析云原生Java的核心技术栈。:通过Istio暴露的/metrics端点。助力传统应用平滑转型为弹性云原生架构。:Kubernetes存活/就绪探针。:服务拓扑与流量可视化。
2025-03-26 23:15:18
332
原创 《Spring Cloud微服务架构实战:从服务注册到分布式事务解决方案(附秒杀系统架构设计)》
两大场景,结合Nacos、Sentinel、Seata等核心组件源码,系统化拆解Spring Cloud微服务架构的核心模块与生产级优化方案。"为什么微服务注册中心需要心跳机制?分布式事务如何兼顾性能与一致性?如何设计千万级并发的秒杀系统?RM注册分支事务,执行业务SQL并生成undo log。:服务端主动探测,适用于K8s等环境。:客户端主动上报心跳,超时自动剔除。TM开启全局事务(生成XID),助力构建高可用分布式系统。TC协调所有RM提交/回滚。:提前加载库存到Redis。
2025-03-25 18:56:46
415
原创 《Java响应式编程精要:从Reactor到WebFlux性能优化实战(附百万并发压测报告)》
"为什么响应式编程能轻松支撑百万并发?传统Servlet模型的阻塞瓶颈如何突破?两大场景,结合Reactor源码与Gatling压测数据,深度解析响应式编程的核心原理与工程实践。☆开启Hooks.onOperatorDebug()(生产环境慎用)☆不适合:事务密集型/复杂计算任务(建议结合线程池隔离)通过@RequestMapping注解自动路由。☆使用.checkpoint("描述")标记检查点。1000并发用户,混合IO操作(DB查询+外部API调用):订阅控制(背压协商):发布者与订阅者的组合。
2025-03-24 20:29:48
230
原创 《Java异步编程全解析:从Future到CompletableFuture高级组合》
CompletableFuture如何用链式调用实现复杂异步逻辑?两大场景,深入解析Java异步编程的演进与最佳实践。:CPU密集型与IO密集型任务使用不同线程池。实现Map-Reduce模式。源码与JMH性能测试,揭示。多个Future协同困难。区别:前者抛出未检查异常。"为什么Future的。缺乏异常组合处理能力。
2025-03-23 20:01:55
247
原创 《Java线程间通信全指南:从wait/notify到StampedLock性能优化》
"为什么wait()必须搭配synchronized使用?StampedLock如何通过乐观读提升10倍性能?如何实现多阶段任务的线程协同?两大场景,全面解析Java线程间通信的核心机制与高阶技巧。结合JMH性能测试数据与JUC源码,深入对比。:使用ConcurrentHashMap代替synchronized Map。读操作无锁化(通过版本号校验)循环检查条件(防止虚假唤醒)写操作优先(避免写线程饥饿):CAS操作替代锁机制。:只在必要代码段加锁。
2025-03-22 20:25:23
417
原创 《Java内存模型与Happens-Before规则:从指令重排序到屏障指令实战》
三大核心问题切入,结合X86架构的MESI协议与JVM源码,深度解析Java内存模型(JMM)的设计哲学。"为什么双重检查锁单例模式必须加volatile?CPU缓存不一致如何导致线程安全问题?不同CPU核心修改会触发缓存行无效化(MESI协议)不同线程间变量传递不可见(除非同步)两个变量位于同一缓存行(64字节)线程操作变量需通过工作内存副本。所有变量存储在主内存。
2025-03-21 22:30:20
324
原创 《Java原子类与CAS原理深度剖析:从自旋锁到无锁编程实战》
"为什么AtomicInteger在高并发下性能暴跌?CAS操作究竟如何实现线程安全?LongAdder凭什么比AtomicLong快10倍?两大场景,结合Hotspot源码与汇编指令解析,彻底讲透CAS机制的实现原理与工程实践。:通过Cell数组减少CAS竞争。:避免伪共享(缓存行填充):无竞争时使用base变量。类调用本地CAS方法。
2025-03-20 18:14:28
220
原创 《Java并发容器全解析:从ConcurrentHashMap到阻塞队列实战(附高并发场景设计指南)》
"为什么ConcurrentHashMap的size()方法可能不准确?如何用阻塞队列实现百万级日志异步收集?两大场景,深度解析Java并发容器的实现原理与工程实践。结合JDK源码与性能压测数据,揭示。:链表长度≥8时转为红黑树(O(n) → O(log n)):避免伪共享(@Contended注解)❌ 写操作内存占用大,不适合频繁修改。:读多写少(如黑白名单过滤)✅ 读操作完全无锁,性能极高。:基于环形数组与CAS。:桶级别锁代替全局锁。返回近似值(非精确)
2025-03-19 19:34:22
301
原创 《Java线程池深度解析:从核心参数到饱和策略实战》
"线程池核心数设置多少合适?为什么任务队列满了会导致OOM?如何设计可降级的异步任务系统?本文通过贯穿线程池参数调优全过程,结合源码解析核心机制,并给出与的最佳实践。:严格要求数据一致性,不允许任务丢失:需要温和降级的普通业务系统:时效性强的场景(如缓存刷新):允许丢失部分数据的采集类任务:使用无界队列(如LinkedBlockingQueue未指定容量):根据系统承载能力设置合理队列大小:添加超时控制与线程中断检查:CPU利用率高但吞吐量低(查看上下文切换次数)
2025-03-18 22:37:58
240
原创 《Java并发编程入门:从线程创建到锁机制全面解析》
"为什么多线程开发总伴随数据错乱?synchronized和Lock究竟该如何选择?贯穿线程安全问题的产生与解决,结合JVM内存模型解析线程工作原理。不保证原子性(需配合synchronized/CAS):释放锁进入等待,需在同步块调用。:提示调度器让出CPU(不保证)保证可见性:修改立即同步到主内存。(不推荐-单继承限制):随机唤醒一个等待线程。
2025-03-17 23:01:13
304
原创 《Java泛型与反射终极指南:从类型擦除到动态代理实战》
验证泛型类型擦除的本质,结合ASM框架分析动态代理的底层实现,并实战开发一个。使用MethodHandle(JSR 292,性能接近原生调用)缓存Method/Field对象(避免重复获取)如何用反射突破单例模式的私有构造方法?
2025-03-16 18:57:25
379
原创 《Java集合框架终极指南:从源码剖析HashMap的死锁与扩容优化》
为什么JDK1.7的HashMap会在多线程扩容时导致CPU 100%?JDK1.8的红黑树优化真的能解决所有问题吗?本文通过,揭示HashMap在并发环境下的致命缺陷与优化逻辑。包含,以及。:数组 + 链表(头插法):数组 + 链表/红黑树(尾插法,链表长度≥8时树化)初始容量(默认16)负载因子(默认0.75,触发扩容阈值=容量×负载因子)树化阈值(TREEIFY_THRESHOLD=8)
2025-03-15 21:43:35
325
原创 《Java字符串深度解析:从常量池到StringTable源码剖析》
出发,解析字符串常量池(StringTable)的哈希表实现、内存回收机制,以及JDK13+的。:固定大小的HashTable(默认桶数60013),链表防冲突。:JDK7前在方法区(PermGen),JDK7+移至堆内存。到底创建了几个对象?为什么阿里开发规范强制禁用这种方式?LATIN1编码(1字节/字符)存储纯英文,节省50%内存。:处理百万级手机号脱敏(131****1234)(JDK 17 String.class节选)(内部synchronized)优先缓存高频字符串(如枚举值)
2025-03-14 21:13:19
543
原创 《Java方法调用与参数传递:值传递还是引用传递?(从字节码验证真相)》
为什么修改对象参数会影响原始对象,但基本类型参数不会?反编译验证参数传递的本质。揭露“对象传递看似引用传递”的假象,并给出。是,传递数组引用地址的副本,但通过副本仍可修改数组元素。方法内修改对象属性会影响原对象(因指向同一内存)获得的是str地址副本,指向原"Hello",从此彻底避免参数传递引发的隐蔽Bug。等不可变对象的“修改”实为创建新对象。让副本指向新对象,原str不变。,方法内修改不影响原始变量。让副本指向新地址0x200,方法内让引用指向新对象。欢迎分享你的踩坑经历。时,传递的是u引用的。
2025-03-13 20:06:08
906
原创 《Java变量与数据类型:从内存分配理解底层原理(附高频面试陷阱剖析)》
出发,解析基本类型与引用类型的底层差异,揭秘自动装箱、字符串驻留等机制的实现原理。JVM规范未明确定义,通常按1字节处理,但部分JVM优化为1位。:Java对-128~127的Integer对象预缓存(通过。内存占用:变量本身固定(4/8字节指针),对象大小不固定。若常量池无"abc":1个常量池对象 + 1个堆对象。内存占用:固定大小(如int=4字节)若常量池已有"abc":仅1个堆对象。(int, double等)赋值特性:直接存储值,传递时。(String、自定义对象)赋值特性:传递时复制。
2025-03-12 20:29:27
609
原创 《Java第一个程序:从HelloWorld到面向对象思维培养(附代码重构实战)》
为什么我写的HelloWorld和别人的一样,但面试官却说我的代码‘没有对象思维’?简单功能可以,但复杂系统需通过OOP实现高内聚低耦合。本文不仅教你写出规范的HelloWorld,更通过。,带你从“面向过程”到“面向对象”的思维升级!工具类方法或需要脱离对象调用的场景(如。新手常见问题:中文引号导致编译失败(:将“构建消息”和“打印消息”解耦。(编译报错:类名大小写敏感):将消息生成逻辑封装到独立类。:明确指向当前对象属性。欢迎分享你的重构思路。:必须与文件名一致(:业务逻辑与实现解耦。
2025-03-11 19:03:44
214
原创 《Java零基础避坑指南:手把手教你配置开发环境(附常见问题解决)》
本文从JDK安装、环境变量配置、工具链选择三个核心步骤出发,结合新手高频错误案例,带你彻底搞定Java开发环境!安装路径不要包含中文或空格(错误示例:C:\Program Files\Java 改为 E:\javajdkStore\java17\jdk17)变量值:JDK安装路径(例如:D:\DevTools\Java\jdk-17)不要直接写死路径(如D:\...\bin),用%JAVA_HOME%动态引用。○避坑:不要盲目安装最新版本(如JDK 21可能存在兼容问题)IDEA安装教程(附汉化指南)
2025-03-10 19:14:04
441
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人