从零开始手写Spring:tiny-spring核心架构深度解析
tiny-spring是一个精简版的Spring框架实现,专为学习Spring内部原理而设计。通过这个轻量级IoC容器,开发者可以快速理解Spring核心功能的实现机制,包括依赖注入、AOP代理和Bean生命周期管理等核心特性。本文将带你深入探索tiny-spring的架构设计与实现原理,帮助你从零构建自己的Spring框架。
🌟 tiny-spring核心功能概览
tiny-spring作为Spring的精简实现,包含了以下关键功能:
- IoC容器:支持Singleton类型Bean的注册、初始化与属性注入
- 依赖注入:自动处理Bean之间的依赖关系
- XML配置:从XML文件读取Bean定义和配置信息
- AOP支持:基于AspectJ表达式的面向切面编程实现
- 动态代理:同时支持JDK动态代理和CGLIB代理两种方式
这些功能通过模块化设计实现,核心代码位于src/main/java/us/codecraft/tinyioc目录下,包含beans、context和aop三个主要模块。
🧩 核心架构设计
tiny-spring的架构遵循了Spring的经典设计模式,通过分层设计实现了功能解耦。主要架构层次如下:
1. 资源加载层
负责从XML文件加载Bean定义,主要涉及以下类:
Resource:资源抽象接口ResourceLoader:资源加载器XmlBeanDefinitionReader:XML解析器
2. Bean工厂层
核心IoC容器实现,负责Bean的注册、实例化和管理:
BeanFactory:Bean工厂顶层接口AbstractBeanFactory:抽象工厂实现,定义模板方法AutowireCapableBeanFactory:自动装配实现
3. 应用上下文层
提供高级容器功能,整合资源加载和Bean工厂:
ApplicationContext:应用上下文接口ClassPathXmlApplicationContext:XML配置实现
4. AOP层
实现面向切面编程功能:
AopProxy:代理顶层接口JdkDynamicAopProxy:JDK动态代理实现Cglib2AopProxy:CGLIB代理实现AspectJExpressionPointcut:AspectJ表达式支持
🔍 Bean加载流程深度解析
tiny-spring中Bean的加载是核心流程,涉及资源加载、解析、实例化和初始化等多个步骤。下图展示了普通Bean的完整加载时序:
Bean加载主要步骤:
- 资源定位:
ClassPathXmlApplicationContext通过ResourceLoader定位XML配置文件 - Bean定义解析:
XmlBeanDefinitionReader解析XML,生成BeanDefinition对象 - Bean注册:将
BeanDefinition注册到BeanFactory中 - Bean实例化:调用
getBean()方法时触发Bean实例化 - 属性注入:自动注入依赖的Bean和属性值
- 初始化:执行初始化方法和
BeanPostProcessor后置处理器
这一流程充分体现了模板方法模式的应用,在AbstractBeanFactory中定义了Bean加载的骨架,具体实现由子类完成。
💡 AOP实现原理
tiny-spring的AOP模块实现了基于代理模式的切面编程,支持两种动态代理方式:
JDK动态代理 vs CGLIB代理
- JDK动态代理:基于接口实现,必须实现至少一个接口,仅代理接口中的方法
- CGLIB代理:基于类继承实现,无需接口,可以代理类中的所有方法(除final方法)
AOP核心组件
tiny-spring通过以下核心类实现AOP功能:
- Pointcut:定义切入点,确定哪些方法需要被增强
- Advice:定义增强逻辑,即切面代码
- Advisor:组合Pointcut和Advice,形成完整的切面定义
- ProxyFactory:代理工厂,负责创建代理对象
- AdvisedSupport:保存AOP配置信息,供代理使用
🎯 设计模式在tiny-spring中的应用
tiny-spring广泛应用了多种设计模式,主要包括:
1. 工厂模式
BeanFactory接口及其实现类采用工厂模式,负责Bean的创建和管理。getBean()方法是典型的工厂方法,由子类决定具体的实例化逻辑。
2. 单例模式
tiny-spring默认采用单例模式管理Bean,在AbstractApplicationContext的preInstantiateSingletons()方法中实现了单例Bean的预实例化。
3. 代理模式
AOP模块通过JDK动态代理和CGLIB代理实现方法增强,是代理模式的经典应用。
4. 模板方法模式
AbstractBeanFactory中定义了Bean加载的模板方法,具体实现由子类AutowireCapableBeanFactory完成,体现了模板方法模式的思想。
5. 外观模式
ClassPathXmlApplicationContext作为外观类,封装了资源加载、Bean定义解析和Bean实例化等复杂过程,为用户提供简单易用的接口。
🚀 快速开始使用tiny-spring
要开始使用tiny-spring,首先需要克隆项目仓库:
git clone https://gitcode.com/gh_mirrors/ti/tiny-spring
项目使用Git标签管理不同功能阶段,你可以通过以下命令切换到特定版本:
# 查看所有标签
git tag
# 切换到指定版本
git checkout step-1-container-register-and-get
版本历史可以在项目的changelog.md文件中查看。
📚 总结
tiny-spring作为Spring框架的精简实现,完美展现了Spring核心原理和设计思想。通过学习tiny-spring,开发者可以深入理解IoC容器的实现机制、AOP的代理原理以及各种设计模式在框架开发中的应用。
无论是Spring初学者还是有经验的开发者,tiny-spring都是一个极好的学习资源,它将帮助你从源码层面理解Spring的工作原理,提升框架设计能力。
希望本文能为你学习Spring提供有力的帮助,祝你的Spring学习之旅顺利!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






