当前位置: 首页 > article >正文

Sprinig源码解析

前言

  Spring 框架是 Java 企业级开发的基石,其源码设计体现了模块化、扩展性和灵活性。以下从 IoC 容器、AOP 实现、核心模块和关键设计模式四个角度对 Spring 源码进行深度解析,帮助理解其底层机制。即使Spring会使用的人见得就能使用。

一、IoC 容器源码解析

  IoC(控制反转)是 Spring 的核心,其核心接口是 BeanFactory 和 ApplicationContext。

1.1. Bean 的生命周期

Spring 管理 Bean 的完整生命周期,关键步骤如下:

1.Bean 定义加载:

  • 通过 BeanDefinitionReader(如 XmlBeanDefinitionReader)读取 XML 或注解配置,解析为 BeanDefinition 对象。

2.Bean 实例化:

  • 调用 InstantiationStrategy(默认 CglibSubclassingInstantiationStrategy)创建 Bean 实例。
  • 反射或 CGLIB 动态生成子类(用于处理构造方法注入或 AOP 代理)。

3.依赖注入:

  • 通过 AutowiredAnnotationBeanPostProcessor 处理 @Autowired 注解。
  • 使用 CommonAnnotationBeanPostProcessor 处理 @Resource 等 JSR-250 注解。

4.初始化:

  • 调用 InitializingBean.afterPropertiesSet() 或自定义 init-method。
  • 应用 BeanPostProcessor.postProcessBeforeInitialization() 和 postProcessAfterInitialization()。

5.销毁:

  • 调用 DisposableBean.destroy() 或自定义 destroy-method。

1.2. BeanFactory 与 ApplicationContext

  • BeanFactory:
  • 基础容器接口(DefaultListableBeanFactory 是默认实现)。
  • 延迟加载 Bean,首次调用 getBean() 时实例化。
    ApplicationContext:
  • 扩展自 BeanFactory,提供企业级功能(国际化、事件发布、资源加载等)。
  • 默认在启动时预初始化所有单例 Bean(通过 AbstractApplicationContext.refresh())。

1.3. 源码流程示例

// 核心入口:AbstractApplicationContext.refresh()
public void refresh() {// 1. 加载 BeanDefinitionobtainFreshBeanFactory();// 2. 调用 BeanFactoryPostProcessorinvokeBeanFactoryPostProcessors();// 3. 注册 BeanPostProcessorregisterBeanPostProcessors();// 4. 初始化单例 BeanfinishBeanFactoryInitialization(beanFactory);
}

二、AOP 实现源码解析

Spring AOP 基于动态代理实现,支持 JDK 动态代理和 CGLIB。

2.1. AOP 核心组件

  • Pointcut:定义切点(哪些方法需要被增强)。
  • Advice:定义增强逻辑(前置、后置、环绕等)。
  • Advisor:组合 Pointcut 和 Advice。
  • AopProxy:生成代理对象的接口(JdkDynamicAopProxy 或 ObjenesisCglibAopProxy)。

2.2. 代理创建流程

  1.在 Bean 初始化阶段,AbstractAutoProxyCreator(实现 BeanPostProcessor)拦截 Bean 的创建。
  2.根据 Pointcut 匹配 Bean 的方法,生成代理对象。
  3.调用代理对象的方法时,触发 MethodInterceptor 链式执行。

2.3. 源码示例

// JdkDynamicAopProxy 的 invoke() 方法
public Object invoke(Object proxy, Method method, Object[] args) {// 获取拦截器链List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);// 创建 MethodInvocation 并执行MethodInvocation invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);return invocation.proceed();
}

三、核心模块解析

3.1. 事务管理(@Transactional)

  • 实现原理:

    • 通过 TransactionInterceptor 拦截方法调用。
    • 使用 PlatformTransactionManager(如 DataSourceTransactionManager)管理事务。
  • 关键代码:

// TransactionAspectSupport.invokeWithinTransaction()
protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final InvocationCallback invocation) {TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);try {Object result = invocation.proceedWithInvocation();commitTransactionAfterReturning(txInfo);return result;} catch (Throwable ex) {completeTransactionAfterThrowing(txInfo, ex);throw ex;}
}

3.2. 事件机制(ApplicationEvent)

  • 核心类:

    • ApplicationEventPublisher:发布事件。
    • ApplicationListener:监听事件。
  • 流程:

    • 调用 publishEvent() 发布事件。
    • 通过 SimpleApplicationEventMulticaster 广播事件到所有匹配的监听器。

3.3. SpEL(Spring Expression Language)

  • 解析流程:
    • 使用 SpelExpressionParser 解析表达式。
    • 通过 StandardEvaluationContext 提供上下文变量。

四、关键设计模式

  1. 模板方法模式
  • 应用场景:AbstractApplicationContext.refresh() 定义了容器初始化的骨架,子类可重写特定步骤(如 AnnotationConfigWebApplicationContext)。
  • 示例代码:
public abstract class AbstractApplicationContext {public void refresh() {// 模板方法obtainFreshBeanFactory();prepareBeanFactory(beanFactory);postProcessBeanFactory(beanFactory);// ...}
}
  1. 工厂模式
  • 应用场景:BeanFactory 是工厂接口,DefaultListableBeanFactory 是具体实现。
  1. 代理模式
  • 应用场景:AOP 动态代理、ProxyFactoryBean 创建代理对象。
  1. 观察者模式
  • 应用场景:事件发布与监听机制。

五、调试 Spring 源码的建议

1.入口示例:

// 基于注解的容器初始化
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
userService.save();

2.关键断点:

  • AbstractApplicationContext.refresh():容器初始化的核心入口。
  • AbstractAutowireCapableBeanFactory.createBean():Bean 实例化的关键逻辑。
  • JdkDynamicAopProxy.invoke():AOP 代理方法调用。
  • TransactionInterceptor.invoke():事务管理的拦截逻辑。

六、Spring 源码设计哲学

  1.开闭原则:通过扩展点(如 BeanPostProcessor)支持功能扩展,无需修改核心代码。

  2.单一职责:模块高度解耦(如 BeanFactory 负责 Bean 管理,ApplicationContext 提供企业级功能)。

  3.约定优于配置:通过默认配置减少用户工作量(如自动扫描 @Component 注解)。

总结

  Spring源码通过模块化设计和经典设计模式实现了高度灵活性和扩展性:

  • IoC 容器:以 BeanFactory 为核心,通过 BeanDefinition 和 BeanPostProcessor 管理 Bean 生命周期。
  • AOP:基于动态代理和拦截器链实现切面编程。
  • 事务与事件:通过拦截器和观察者模式提供企业级功能。
  • 扩展机制:开放 BeanFactoryPostProcessor、BeanPostProcessor 等扩展点。

  深入Spring源码不仅能帮助解决实际开发中的复杂问题(如性能优化、定制化需求),还能提升对框架设计思想的理解,为开发高质量应用奠定基础。

相关文章:

Sprinig源码解析

前言 Spring 框架是 Java 企业级开发的基石&#xff0c;其源码设计体现了模块化、扩展性和灵活性。以下从 IoC 容器、AOP 实现、核心模块和关键设计模式四个角度对 Spring 源码进行深度解析&#xff0c;帮助理解其底层机制。即使Spring会使用的人见得就能使用。 一、IoC 容器源…...

ComfyUI流程图生图原理详解

一、引言 ComfyUI 是一款功能强大的工具&#xff0c;在图像生成等领域有着广泛应用。本文补充一点ComfyUI 的安装与配置过程遇到的问题&#xff0c;并深入剖析图生图过程及相关参数&#xff0c;帮助读者快速入门并深入理解其原理。 二、ComfyUI 的安装与配置中遇到的问题 &a…...

使用右侧值现象来处理一个word导入登记表的需求

需求也简单&#xff0c;导word文件用户登记表&#xff0c;有各部门的十几个版本&#xff08;为什么这么多&#xff1f;不知道&#xff09;。这里说下谈下我的一些代码做法&#xff1a; 需求分析&#xff1a; 如果能解决java字段和各项填的值怎么配对的问题&#xff0c;那么就…...

《open3d pyqt》Alpha重建

《open3d pyqt》Alpha重建 一、效果展示二、qt设置2.1 主界面添加动作2.2 dialog 界面、布局如下:三、核心代码一、效果展示 二、qt设置 2.1 主界面添加动作 2.2 dialog 界面、布局如下: 并生成py文件,参考前述章节 三、核心代码 main.py文件增加 from Su...

深度解析HTTP/HTTPS协议:从原理到实践

深入浅出HTTP/HTTPS协议&#xff1a;从原理到实践 前言 在当今互联网世界中&#xff0c;HTTP和HTTPS协议如同空气般存在于每个网页请求的背后。作为开发者或技术爱好者&#xff0c;理解这些基础协议至关重要。本文将用六大板块&#xff0c;配合原理示意图和实操案例&#xff0…...

数据结构:顺序表(Sequence List)及其实现

什么是顺序表&#xff1f; 顺序表是一种最简单的数据结构&#xff0c;它就像一排连续的小房子&#xff0c;每个房子里都住着一个数据元素。这些房子是按顺序排列的&#xff0c;每个房子都有一个门牌号&#xff08;下标&#xff09;&#xff0c;我们可以通过门牌号快速找到对应…...

小程序canvas2d实现横版全屏和竖版逐字的签名组件(字帖式米字格签名组件)

文章标题 01 功能说明02 效果预览2.1 横版2.2 竖版 03 使用方式04 横向签名组件源码4.1 html 代码4.2 业务 Js4.3 样式 Css 05 竖向签名组件源码5.1 布局 Html5.2 业务 Js5.3 样式 Css 01 功能说明 技术栈&#xff1a;uniapp、vue、canvas 2d 需求&#xff1a; 实现横版的全…...

MoE演变过程

MoE演变过程 1 MoE1.1 BasicMoE1.2 SparseMoE1.2.1 实现 1.3 Shared Expert SparseMoE 1 MoE 参考&#xff1a;https://huggingface.co/blog/zh/moe 1.1 BasicMoE 用router给出各专家的权重&#xff0c;然后让输入过每一个专家&#xff0c;然后做加权求和。 1.2 SparseMoE …...

【Leetcode 热题 100】1287. 有序数组中出现次数超过25%的元素

问题背景 给你一个非递减的 有序 整数数组&#xff0c;已知这个数组中恰好有一个整数&#xff0c;它的出现次数超过数组元素总数的 25 % 25\% 25%。 请你找到并返回这个整数。 数据约束 1 ≤ a r r . l e n g t h ≤ 1 0 4 1 \le arr.length \le 10 ^ 4 1≤arr.length≤104 0…...

ruby 的安装

在51cto搜索的资料 ruby on rails的安装 http://developer.51cto.com/art/200906/129669.htm http://developer.51cto.com/art/200912/169391.htm http://developer.51cto.com/art/200908/147276.htm 史上最完整的ruby&#xff0c;rails环境架设配置&#xff08;Apachefast…...

【java】List<String> fruits = new ArrayList<>(); 这一句是什么

1. 代码分解 java Copy List<String> fruits new ArrayList<>(); List<String>&#xff1a; List 是 Java 中的一个接口&#xff0c;表示一个有序的集合&#xff08;可以重复元素&#xff09;。 <String> 是泛型&#xff0c;表示这个列表中的元素…...

通俗诠释 DeepSeek-V3 模型的 “671B” ,“37B”与 “128K”,用生活比喻帮你理解模型的秘密!

欢迎来到涛涛聊AI。 在DeepSeek-V3模型的参数描述中&#xff0c;你可能会看到类似“671B 37B 128K”这样的标记。这些字母和数字的组合看起来像密码&#xff0c;但其实它们揭示了模型的“大脑容量”和“工作方式”。我们用日常生活的比喻来解释&#xff1a; 一、数字含义&…...

【鸿蒙Next】优秀鸿蒙博客集锦

鸿蒙基础开发&#xff1a;多文件压缩上传及断点续传_鸿蒙 断点续传-CSDN博客...

【实战项目】BP神经网络识别人脸朝向----MATLAB实现

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…...

C++线程安全函数

在 C 中&#xff0c;线程安全的函数是指在多线程环境下可以安全调用&#xff0c;不会导致数据竞争或其他并发问题的函数。C 标准库提供了许多线程安全的函数&#xff0c;同时也要求开发者在使用自定义函数时确保线程安全。以下是一些常见的线程安全函数和实现线程安全的方法&am…...

Java中的分布式(概念说明)

1. 分布式的基本概念 1.1 什么是分布式系统&#xff1f; 分布式系统&#xff08;Distributed System&#xff09;&#xff1a;由多台服务器&#xff08;或节点&#xff09;协同工作&#xff0c;对外提供一个整体服务。不同节点之间通过网络通信来协同处理请求或共享数据&…...

【1.8w字深入解析】从依赖地狱到依赖天堂:pnpm 如何革新前端包管理?

目录 前言npm 的诞生与发展嵌套依赖模型存在的问题npm3架构与yarnYarn 的诞生与局限Yarn 的诞生背景Yarn 仍然存在的问题 何为幽灵依赖依赖结构的不确定性pnpm王牌登场 -- 网状平铺结构安装包速度快依赖管理软链接 和 硬链接 机制 幽灵依赖产生的根本原因包管理工具的依赖解析机…...

【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑤】

ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase05 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月17日 关键词&#xff1a;UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-005测试用例 用例ID测试场景验证要点参考条款预期结果TC…...

137,【4】 buuctf web [SCTF2019]Flag Shop

进入靶场 都点击看看 发现点击work会增加&#xffe5; 但肯定不能一直点下去 抓包看看 这看起来是一个 JWT&#xff08;JSON Web Token&#xff09;字符串。JWT 通常由三部分组成&#xff0c;通过点&#xff08;.&#xff09;分隔&#xff0c;分别是头部&#xff08;Header&…...

Node.js 异步并发控制:`p-map` 和 `p-limit` 的使用与对比

在 Node.js 中&#xff0c;处理异步任务是开发中非常常见的需求。无论是批量处理数据、调用外部 API&#xff0c;还是操作文件系统&#xff0c;我们经常需要对多个异步任务进行管理。然而&#xff0c;当任务数量较多时&#xff0c;如果不加以控制&#xff0c;并发可能会导致性能…...

【c++】c++内存管理

目录 c和c的内存分布回顾C语言动态管理内存的方式malloccallocreallocfree C动态管理内存的方式new和deleteoperator new和operator delete定位new c和c的内存分布 回顾C语言动态管理内存的方式 malloc void* malloc (size_t size);malloc可以在堆上开辟指定内存的空间&#…...

EtherNet/IP转Modbus TCP:新能源风电监控与分析实用案例

EtherNet/IP转Modbus TCP&#xff1a;新能源风电监控与分析实用案例 一、案例背景 在某新能源汽车电池生产线上&#xff0c;需要将采用EtherNet/IP协议的电池检测设备与采用ProfiNet协议的生产线控制系统进行集成&#xff0c;以实现对电池生产过程的全面监控和数据采集。 二、…...

伪装目标检测(Camouflaged Object Detection, COD)教程

1. 引言 伪装目标检测&#xff08;Camouflaged Object Detection, COD&#xff09;是一项计算机视觉任务&#xff0c;旨在识别和分割背景中难以察觉的目标&#xff0c;如动物伪装、隐形物体检测等。由于伪装目标通常与背景高度相似&#xff0c;这项任务比传统的目标检测更具挑…...

烧烤炉出口亚马逊欧盟站CE认证EN1860安全标准

什么是欧盟CE认证&#xff1a; 在欧盟市场“CE”标志属强制性认证标志&#xff0c;不论是欧盟内部企业生产的产品&#xff0c;还是其他国家生产的产品&#xff0c;要想在欧盟市场上自由流通&#xff0c;就必须加贴“CE”标志&#xff0c;以表明产品符合欧盟《技术协调与标准化新…...

动态DNS神器nip.io使用指南:快速实现域名与IP的动态映射--告别配置本地hosts

动态DNS神器nip.io使用指南&#xff1a;快速实现域名与IP的动态映射--告别配置本地hosts 一、项目简介二、快速入门三、进阶配置四、典型应用场景 本文基于开源项目 v1.2.1版本撰写&#xff0c;适用于开发测试、CI/CD等场景 一、项目简介 nip.io 是由Exentrique Solutions开发…...

人工智能 - 机器学习、深度学习、强化学习是人工智能领域的理论基础和方法论

机器学习、深度学习、强化学习是人工智能领域的三大核心方向,各自具有独特的理论基础和方法论。以下是它们的核心理论知识总结: 一、机器学习(Machine Learning, ML) 1. 基础概念 目标:通过数据驱动的方式,让机器从经验中学习规律,完成预测、分类或决策任务。 核心范式…...

数字电路-基础逻辑门实验

基础逻辑门是数字电路设计的核心元件&#xff0c;它们执行的是基本的逻辑运算。通过这些基本运算&#xff0c;可以构建出更为复杂的逻辑功能。常见的基础逻辑门包括与门&#xff08;AND&#xff09;、或门&#xff08;OR&#xff09;、非门&#xff08;NOT&#xff09;、异或门…...

国产编辑器EverEdit - 如虎添翼的功能:快速选择

1 快速选择 1.1 应用场景 快速选择适用于批量选择和修改的场景&#xff0c;比如&#xff1a;变量改名。 1.2 使用方法 1.2.1 逐项快速选择 将光标放置在单词前或单词中&#xff0c;选择主菜单查找 -> 快速选择 -> 快速选择或使用快捷键Ctrl D 注&#xff1a;光标放…...

国内外网络安全政策动态(2025年1月)

▶︎ 1.国家互联网信息办公室发布《个人信息出境个人信息保护认证办法&#xff08;征求意见稿&#xff09;》 1月3日&#xff0c;国家互联网信息办公室发布《个人信息出境个人信息保护认证办法&#xff08;征求意见稿&#xff09;》。根据《意见稿》&#xff0c;个人信息出境个…...

68页PDF | 数据安全总体解决方案:从数据管理方法论到落地实践的全方位指南(附下载)

一、前言 这份报告旨在应对数字化转型过程中数据安全面临的挑战&#xff0c;并提供全面的管理与技术体系建设框架。报告首先分析了数字化社会的发展背景&#xff0c;强调了数据安全在国家安全层面的重要性&#xff0c;并指出数据安全风险的来源和防护措施。接着&#xff0c;报…...