自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

原创 Spring容器的心脏:深度解析refresh()方法(上)

因此prepareRefresh主要作用是准备容器刷新的前期工作,包括初始化上下文环境、验证必要的系统属性是否存在、初始化早期事件监听器集合()并保存容器启动时的活跃标志,为后续的 Bean 定义加载、容器初始化等核心流程奠定基础,确保容器能在一个就绪的状态下开始刷新操作。因此整个执行的逻辑则是,如果含有BeanFactory则销毁原来的并且重写创建一个新的BeanFactory,进行属性赋值随后调用。

2025-10-10 14:14:38 895

原创 Spring原理揭秘--三级缓存

/ A 依赖 B@Component@Autowired// B 依赖 A@Component@Autowired当 Spring 容器初始化 A 时,需要注入 B;初始化 B 时,又需要注入 A。如果没有特殊处理,会陷入 “初始化 A → 需要 B → 初始化 B → 需要 A → 初始化 A...” 的无限循环,最终导致失败。Spring 通过三个缓存(Map)存储单例 Bean 的不同状态,从 “未完全初始化” 到 “完全初始化” 逐步过渡,这三个缓存被称为 “三级缓存”,具体如下。

2025-10-09 14:36:35 982

原创 Spring原理揭秘--ApplicationContext初始化中的扩展点

在整个refresh方法中有许许多多的扩展点可供开发者利用切入,下面我们来就来盘点一下在整个refresh方法中的扩展点都有哪些在BeanFactory准备阶段中第一个出现可切入的步骤是在invokeBeanFactoryPostProcessors中在这个阶段中往往是首先执行ConfigurationClassPostProcesser类,在执行的过程中则会调用ImportSelector和ImportBeanDefinitionRegister的回调方法来进行扩展操作,因此开发者可以自定义实现Impor

2025-10-08 16:21:56 565

原创 Spring Boot 深入剖析:SpringBoot的启动流程

本章我们来讲一下整个SpringBoot的启动流程,在程序启动的时候其实是运行的main方法当做程序的入口来实现的。而main方法则是调用的run方法来实现的。因此整个SpringBoot的启动流程的逻辑都在run方法中的。

2025-09-17 09:15:13 637

原创 Spring Boot 深入剖析:SpringApplicationRunListener

在研究SpringBoot的启动源码的时候我们看到run方法中有一个之前没见过的类SpringApplicationRunListeners 类,那么这个类的主要作用是什么呢?接下来我们来解析一下这个类。

2025-09-15 09:20:18 1182

原创 Spring Boot 深入剖析:BootstrapRegistry 与 BeanDefinitionRegistry 的对比

在 Spring Boot 的启动过程中,和是两个名为“Registry”却扮演着截然不同角色的核心接口。理解它们的差异是深入掌握 Spring Boot 启动机制和进行高级定制开发的关键。

2025-09-10 11:06:06 863

原创 Spring的容器扩展机制三大基石

特性操作目标Bean的定义Bean的实例(Object)的集合作用时机Bean实例化之前Bean实例化、依赖注入之后初始化回调前后容器启动时,注册所有BeanPostProcessor功能修改Bean的元数据、蓝图增强、包装、检查Bean实例管理BeanPostProcessor的生命周期和顺序比喻修改汽车设计蓝图的人给成品汽车改装、贴膜、质检的人工厂的工具和设备管理员使用方式开发者常用,需实现接口开发者常用,需实现接口Spring内部使用,开发者一般不直接接触。

2025-09-07 20:33:57 1152

原创 RocketMQ如何处理消息堆积

mq出现消息堆积本质上是导致的结果。处理消息堆积需要一个系统性的方法,从快速定位问题根源到实施相应的解决方案。

2025-09-06 21:59:17 535

原创 SpringBoot是如何实现自动装配呢(一)?

在我们使用springBoot的时候很多的spring底层配置类我们都没有手动配置,而当运行的时候则会自动的加载这些配置类到spring容器中。包括我们集成的一些其他框架都是仅仅在pom文件中添加了依赖运行时候即可导入ioc容器中对应的bean。那么这些bean到底是如何导入进去的呢?下面我们来看一看源码来进行解析我们知道整个springBoot能运行时候的关键在于@SpringBootApplication 注解。

2025-09-04 13:44:55 728 1

原创 RestTemplate 连接池怎么合理的使用

RestTemplate底层不直接支持连接池,需依赖HTTP客户端库实现。通过配置Apache HttpClient可启用连接池,关键参数包括:最大总连接数setMaxTotal(200)、单路由连接数setDefaultMaxPerRoute(50)、空闲连接检查间隔setValidateAfterInactivity(30000ms)等。相比Tomcat处理入站请求的连接池,RestTemplate连接池用于管理出站HTTP请求,影响外部API调用性能。配置时需注意连接超时(setConnectTime

2025-09-02 22:16:05 87

原创 SpringBoot最多能处理多少请求

现在,我们把整个流程串起来,模拟一个请求的“一生”:一个新请求(客户)到来。检查:保安看整个大厅人数是否已满。如果满了,直接拒绝入内(连接被拒绝)。否则,允许进入。线程池检查:请求进入后,经理看是否有空闲的柜员窗口(线程)。有空闲线程:立即分配一个窗口处理请求。无空闲线程:经理会尝试开设新窗口(创建新线程),但前提是当前总窗口数不能超过max。队列检查:如果线程池已满(窗口数达到max),且无法立即处理,就把请求请到等候区 (排队。超时检查如果请求在队列中等待的时间过长,客户端可能会主动超时。

2025-09-01 13:50:04 735

原创 有限内存如何读取并检查大量数据是否重复

本文介绍了Java中处理大文件去重的分片方法。通过哈希分片技术将大文件拆分为多个小文件,确保相同数据进入同一分片。核心实现包括:1)使用缓冲区(Buffer)分批读取文件;2)对每行数据计算哈希值并分配到对应分片;3)单独处理每个分片进行去重。文中提供了完整代码示例,包含缓冲区读写、哈希分片、结果验证等功能模块,适用于内存有限情况下的大数据处理场景。该方法采用"分而治之"策略,有效解决了内存不足时处理海量数据的问题。

2025-08-28 08:57:48 170

原创 如何记录海量用户的连续签到

摘要:电商平台常用Redis的BitMap位数组存储用户签到数据,以节省海量数据存储空间。实现方式有两种:1)以用户为key,每日签到状态对应位图中的位,便于查询单个用户数据;2)以日期为key,用户ID哈希后对应位,便于统计当日签到情况。BitMap优势在于极度节省内存、位操作高效,适合处理大规模布尔值状态,但存在稀疏性问题和偏移量限制。核心方法包括签到记录、连续签到统计和全局数据分析,通过位操作实现高效查询和复杂计算。

2025-08-27 16:43:30 767

原创 对于MQ如何保证顺序消费

下面我们看一下剩余的源码,下面源码则是告诉了如何调用MessageQueueSelector 的。这个invokeMessageQueueSelector方法则是send方法调用的这个函数,这个方法的主要作用是获得topic的相关信息,随后得到当前topic的所有队列然后传递给MessageQueueSelector 随后进行调用MessageQueueSelector 的select方法然后得到对应的队列。

2025-08-26 16:56:00 1026

原创 Redis缓存雪崩&&缓存击穿&&缓存穿透的处理方式

当我们在项目中使用到redis的时候,那么势必会考虑如果出现缓存雪崩,缓存击穿,缓存穿透之后会怎么办。下面我们来讲讲解决方案。

2025-08-25 22:26:59 298

原创 订单超时处理业务设计

文章摘要:电商平台中订单超时等业务场景可采用多种设计方案:1)DelayQueue实现简单高效但内存占用高且不支持分布式;2)MQ支持分布式但存在存储成本高、消费延迟等问题;3)Redis键过期监听实现简单但可靠性差;4)分布式定时任务(如xxl-job)稳定性高、容错性强,适合大厂高并发场景,但需处理分片策略和幂等问题。各方案需根据业务特点权衡时间精度、系统稳定性和成本等因素。大厂通常采用分布式定时任务+专用超时库的方案,并配合防重机制和状态机校验确保业务可靠性。

2025-08-19 10:27:55 584

原创 SpringBoot原理揭秘--Environment

那么为什么还要将其设置为抽象类呢,目的就是对于一些子类的Environment往往是使用在不同的特殊场景,而这些场景就需要额外的属性或者方法来实现,因此这些落地实现的子类更多的是对AbstractEnvironment在应对不同的场景中进行的拓展。它定义了统一的属性访问协议,使应用程序能够以标准化的方式获取各种来源的配置值。也就是说Profile本质上是通过代码内部设置不同的profile值而在运行的时候使用这些profile值中的一个从而能实现不同profile值运行的代码以及环境不同的效果。

2025-08-18 15:45:49 805

原创 设计秒杀系统从哪些方面考虑

本文系统阐述了秒杀系统的架构设计方案。主要从访问层、负载层和服务层三个维度进行解析:访问层采用静态资源CDN部署、按钮防重复点击及验证码机制;负载层通过LVS+Keepalived+Nginx集群实现高可用负载均衡,结合限流和监控;服务层重点解决高并发和库存一致性,采用Redis预减库存、分布式锁、异步订单生成和MQ最终一致性方案。文章还特别强调了支付模块的幂等性处理和超时订单恢复机制,形成完整的秒杀业务流程闭环。整体设计充分考虑了系统的高并发承载能力和数据一致性保障。

2025-08-13 22:18:24 643

原创 线上死锁定位&&避免

在线上部署项目的时候,当项目运行一段时间之后可能出现死锁的情况,如果不进行排查和解决那么就会造成线程阻塞,严重时候则会造成服务雪崩,因此当出现阻塞的时候第一时间要进行准确的定位。

2025-08-12 10:22:47 155

原创 项目上线后出现OOM

项目上线后当遇到服务的高峰期的时候可能会出现OOM的情况,那么OOM都出现在JVM的哪些部分呢?-Xmx-Xssulimit -u对于如何定位OOM出现的位置以及情况呢?

2025-08-11 14:08:37 636

原创 百万数据报表导出防OOM技巧

单线程导出通常采用简单的逻辑:一次性从数据库查询出所有需要导出的数据(或分页但每页数据量仍很大)。

2025-08-06 22:24:27 718

原创 SpringBoot原理揭秘--BeanFactory和ApplicationContext

AbstractAutowireCapableBeanFactory是 Spring 框架中实现 Bean 创建、依赖注入和初始化的核心抽象基类,它在 Spring IoC 容器体系中扮演着至关重要的角色。上图则是有关AbstractAutowireCapableBeanFactory的层次结构,而AbstractAutowireCapableBeanFactory则是负责bean的生命周期的管理,bean的创建,依赖注入,销毁。这些阶段都在本类中的方法中执行。是 Spring IoC 容器的引擎核心。

2025-08-05 21:15:24 787

原创 SpringBoot原理揭秘--自动装配(终)

SpringBootConfiguration实际上是@Configuration的子注解,他的主要作用则是与Configuration注解的作用一样被注解的类充当配置类,唯一的区别是@SpringBootConfiguration被注解的类会被首先加载到ioc容器中,也就是说是@SpringBootConfiguration注解可以控制加载bean的顺序。@ComponentScan注解的主要作用则是扫描当前类的包下的所有用户自定义的bean,将这些bean加载到ioc容器中去,从。

2025-07-31 21:44:55 946

原创 SpringBoot原理揭秘--自动装配

模块可以理解为一个个可以分解,组合,更换的独立单元。一个模块之间可以互相依赖,内部的功能是内聚的,主要目的完成一个功能。

2025-07-28 21:47:26 884

原创 MySQL的底层原理--InnoDB数据页结构

上一章节讲述完innodb存储的结构,本章我们则来讲述一下innodb的数据页结构。我们知道innodb每次读取数据则是取出一页进行读取,那么页的结构则是有多个部分组成:文件头部,页头部,页目录,用户记录,空闲空间,文件尾部,页中最大和最小记录。下面我们来看看各部分的作用。

2025-07-26 20:11:16 1145

原创 MySQL的底层原理--InnoDB记录存储结构

innodb是一个表数据存储到磁盘的存储引擎,即使我们关闭重启服务器,数据还是依然存在的。在innodb中真正读取数据是在内存中读取的,而数据的修改也是在内存中修改后再刷新到磁盘当中去。那么我们想要读取数据的时候肯定不会是一条一条的读取这样会太慢了,那么在innodb当中则是通过一页来进行读取数据的,页的大小为16kb。innodb当中的页大小参数设置则是通过innodb_page_size来进行设置的表明了页的大小,默认是16kb。

2025-07-24 20:50:22 1308

原创 Spring原理揭秘--Spring的AOP

在这之前我们已经介绍了AOP的基本功能和概念,那么当AOP集成到spring则会发生改变。

2025-07-17 16:11:20 990

原创 Spring原理揭秘--初识AOP

我们知道软件开发一直在追求高效,易维护,易扩展的特性方式。在面向过程编程到面向对象编程的历程中,程序的开发有了非常大的进步。但是oop的方式缺依然存在着一些缺点。oop的方式可以将业务进行很好的分解和封装使其模块化,但是却没办法更好的避免类似于系统需求的视线在系统中各处散落这样的问题。比如:不同的主业务可能都会需要一些与业务无关的逻辑代码--日志记录,事务处理等。那么这些相同的无关逻辑在不同业务中的对应关系则会变成1:n的方式。这样就会造成后续维护的成本贼高。因此推出了AOP的方式来对oop的缺点进行优化。

2025-07-14 20:18:04 1390

原创 Spring原理揭秘--基于注解的注入

在之前的方法中我们知道spring是基于xml进行注入的bean,但是在目前的spring中我们一般不再是书写xml文件来一一列出需要管理的bean而是通过注解的方式来完成依赖的注入。下面我们就来聊聊依赖的注入是哪种方式。

2025-07-11 14:34:06 1370

原创 Spring原理揭秘--ApplicationContext(二)

Java SE提供了实现自定义事件发布功能的基础类,EventObject和EventListener接口。所有的自定义事件都可以通过扩展EventObject来实现,而事件的监听器则扩展自EventListener。如果想自定义事件类型则需要继承EventObject类去重写自己类的属性,当事件发布和监听之后相应的监听器即可对该类型的事件进行处理。在java SE中的事件监听器并不会去监听所有的事件,这样会导致监听器非常繁忙,那么每个监听器只会监听自己范围内的事件。

2025-07-10 16:45:00 1170

原创 Spring原理揭秘--ApplicationContext(一)

之前我们讲完了BeanFactory的原理,本章我们来讲一讲ApplicationContext。ApplicationContext除了拥有BeanFactory的所有功能之外,还进一步扩展了基本容器功能,包括BeanFactoryPostProcessor,BeanPostProcessor以及其他特殊类型bean的自动识别,容器启动后bean实例的自动初始化,国际化的信息支持,容器内事件发布等。下面我们就来讲一讲ApplicationContext的特殊功能。

2025-07-10 09:49:11 971

原创 Spring原理揭秘--BeanFactory(二)

而实例化bean对象则是通过InstantiationStrategy定义的实例化策略的抽象接口来实现的实例化,InstantiationStrategy的直接子类simpleInstantiationStrategy的以反射方式实例化对象的功能,而CglibSubclassingInstantiationStrategy继承simpleInstantiationStrategy的采用的则是cglib动态代理的方式来实例化对象。那么在开始第二阶段的getBean方式有显式调用和隐式调用的方式进行处理的。

2025-07-07 14:37:03 745

原创 Spring原理揭秘--BeanFactory(一)

BeanFactory既然是ioc容器的具象化,那么它的主要作用肯定是对bean进行管理,那么想要交给BeanFactory去管理肯定得提供一些信息标记哪些类需要其去管理,之前说明ioc的时候已经说过了是采用了三种方式来告诉ioc进行处理的分别是硬编码,外部信息和注解的方式。在之前我们说过,Spring的IOC容器是一个提供IOC支持的轻量级容器,除了基本的IOC支持,它作为轻量级容器还提供了IOC之外的支持。request:表示在一个请求的区域内对象存活,当请求结束后,对象的生命周期将会结束。

2025-07-04 16:56:14 880

原创 Spring原理揭秘--初步了解IOC

ioc的全称被称为控制反转,它还有一个别名被称作依赖注入(DI),那么它的作用是什么呢在未使用spring框架之前我们创建对象都是通过在哪里需要对象就在哪里用new的方式直接创建的对象。但是这种方式往往会伴随着一些问题--耦合度过高。举个例子就像下述代码其中一个对象的属性需要另一个对象就在这个属性上直接new的方式进行,那么如果new的这个对象后续进行业务上的修改,这些使用它的对象都要跟着一遍一遍的修改,因此耦合对会过高........那么如何能降低耦合度呢?采用第三者的方式来进行解耦。

2025-07-02 21:46:23 1063

原创 Spring原理揭秘(一)

spring框架是一个轻量级的开源的JavaEE框架。所谓轻量级则是:占用空间小,代码侵入性低,代码耦合度低,降低代码复杂度,可以轻易适配多种框架。随着spring的不断发展,它所占用的空间也不断增大从而使得空间小的优势逐渐降低,但是spring依然遵守着尽可能降低占用空间的方式采用了按需加载的方式来管理jar包。并且spring的轻量级真正体现在代码的侵入性低和代码耦合第低的特点,相比于早期的ELB框架有着明显的优势。

2025-07-01 22:34:57 903

原创 深入理解java虚拟机--内存自动分配

对于java程序员来说,在虚拟机的自动内存管理机制的帮助下,不再需要像c++一样为每一个new操作区写配对的delete/free代码。而且不容易出现内存泄漏和内存一出的问题,看起来由虚拟机的管理一切都很美好。不过,也正是因为java程序员把内存控制的权力交给了java虚拟机,一单出现内存泄漏和溢出的问题。如果不了解整个虚拟机是怎样使用内存的,那排查错误将会成为一项异常简单的工作。下面我们就来先简单的了解一下java虚拟机的结构;,这些区域都有各自的用途,以及创建和销毁的时间。

2025-06-30 16:01:14 1131

原创 Mybatis学习总结

在mybatis的源码中可以学习到很多知识:设计模式,mybatis整体架构,每个部分的重点解析,下面我将一一总结。

2025-06-29 12:29:29 1116

原创 MyBatis原理剖析(三)--加载配置文件

之后我们再看看下一个方法。

2025-06-19 21:30:35 1181

原创 MyBatis原理剖析(二)

上一章节我们聊了聊JDBC的缺点以及mybatis的基本框架,本章我们从mapper配置文件入手来解析mybatis我们知道在mybatis中由于数据库连接的配置文件不经常更改,而sql的配置文件则总是要去更改因此对于不同类型的配置文件采用了隔离的机制,对于系统配置文件用sqlMapConfig来进行配置对于sql语句的配置文件则采用mapper配置文件进行配置。

2025-06-08 20:29:44 1164

原创 MyBatis原理剖析(一)

接下来将开辟一个新的专栏Mybatis的原理剖析,里面涉及到了mybatis的整体架构,源码解析等一系列的知识。相信你看完之后则会收获到很多。MyBatis 是一款开源的持久层框架,它对 JDBC 进行了轻量级封装,帮助开发者更便捷地实现数据库操作。相信JDBC大家都是了解过,JDBC 是 Java 与数据库之间的桥梁,提供统一的 API 让 Java 程序能够操作各种关系型数据库(如 MySQL、Oracle、PostgreSQL 等),无需关心底层数据库的具体实现。

2025-06-08 13:30:58 980

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除