The Philosophy of Design (设计哲学)
"What I cannot create, I do not understand." — Richard Feynman
mini-spring 是一个用于学习和理解 Spring 核心原理的实验性项目。
这不是一个生产级的框架,而是一个解构 Spring 的过程。我们剥离了 Spring 庞杂的细节,保留了最核心的 IOC (控制反转) 和 AOP (面向切面编程) 骨架。
本项目特别适合:
- 希望深入理解 Spring 源码但面对几十万行代码无从下手的开发者。
- 偏好 "First Principles" (第一性原理) 思维,想要探究 "Why" 而不仅仅是 "How" 的架构师。
- 需要复习设计模式在实际框架中应用的工程师。
- IOC Container: 完整的 Bean 生命周期管理(定义、注册、实例化、初始化、销毁)。
- Dependency Injection: 支持属性注入、依赖注入(Bean 引用)。
- Resource Loading: 统一资源加载策略(ClassPath, FileSystem, URL)。
- XML Configuration: 支持从
spring.xml解析 Bean 定义。 - Extension Points: 实现了
BeanFactoryPostProcessor和BeanPostProcessor,支持容器扩展。 - Event System: 基于观察者模式的容器事件机制(ApplicationEvent, Listener, Multicaster)。
- AOP: 基于 AspectJ 表达式的切点匹配,支持 JDK 动态代理和 CGLIB 代理,实现自动代理(Auto-Proxy)。
+----------------+ +-----------------------+ +----------------+
| BeanDefinition | <------- | BeanDefinitionRegistry| | BeanFactory |
| (配方/元数据) | | (注册中心) | | (生产工厂) |
+----------------+ +-----------------------+ +----------------+
^ | ^
| v | (get)
+----------------+ +-----------------------+ +----------------+
| ResourceLoader | -------> | BeanDefinitionReader | -------> | Instantiated |
| (资源加载器) | | (读取与解析) | | Bean |
+----------------+ +-----------------------+ +----------------+
+-----------+ +-------+
| Pointcut | ---> | Class |
| (匹配规则) | | Method|
+-----------+ +-------+
^
|
+-----------+ +---------+
| Advisor | <--- | Advice |
| (切面组合) | | (增强逻辑)|
+-----------+ +---------+
|
v
+------------------------+ +---------------------+
| DefaultAdvisorAutoProxy| ---> | AopProxyFactory |
| Creator | | (JDK / CGLIB Strategy)|
+------------------------+ +---------------------+
|
v
+-------------+
| Proxy Object|
+-------------+
io.github.minis.springframework
├── aop // AOP 核心模块
│ ├── aspectj // AspectJ 表达式解析 (Pointcut)
│ ├── framework // AOP 框架核心 (ProxyFactory, MethodInterceptor)
│ │ └── autoproxy // 自动代理创建器 (BeanPostProcessor)
│ └── ...
├── beans // Bean 核心模块
│ ├── factory // 工厂接口与实现
│ │ ├── config // 配置接口 (BeanDefinition, PostProcessors)
│ │ ├── support // 工厂支持类 (AbstractBeanFactory, BeanDefinitionReader)
│ │ └── xml // XML 解析
│ └── ...
├── context // 上下文模块 (ApplicationContext)
│ ├── event // 事件机制 (Multicaster, Event, Listener)
│ └── support // 上下文抽象实现 (AbstractApplicationContext)
└── core // 核心工具
└── io // 资源加载 (Resource, ResourceLoader)
本项目按照由简入繁的顺序开发,建议阅读 commit history 或按以下顺序学习:
- Phase 1: Skeleton - 定义 BeanDefinition 和 BeanFactory 接口,确立“元数据驱动”的设计思想。
- Phase 2: Simple Factory - 实现
DefaultListableBeanFactory,利用模板方法模式完成单例 Bean 的创建和获取。 - Phase 3: Dependency Injection - 实现属性填充(
populateBean),解决 Bean 之间的依赖引用。 - Phase 4: Resource & XML - 引入
ResourceLoader和XmlBeanDefinitionReader,实现从 XML 文件启动容器。 - Phase 5: ApplicationContext - 引入应用上下文,实现
BeanFactoryPostProcessor和BeanPostProcessor扩展点。 - Phase 6: Lifecycle - 实现
InitializingBean,DisposableBean,Aware接口,完善 Bean 的生命周期。 - Phase 7: Events - 实现
ApplicationEventMulticaster,支持容器事件发布与监听。 - Phase 8: AOP Base - 引入 AspectJ 解析切点,实现 JDK 和 CGLIB 动态代理策略。
- Phase 9: Auto-Proxy - 实现
DefaultAdvisorAutoProxyCreator,在 Bean 初始化后自动创建代理对象,融合 AOP 与 IOC。
- 模板方法模式 (Template Method):
AbstractBeanFactory: 定义getBean的标准流程,将createBean留给子类。AbstractApplicationContext: 定义refresh的标准启动流程。
- 策略模式 (Strategy):
InstantiationStrategy: 选择 JDK 反射或 CGLIB 进行实例化。AopProxy: 选择JdkDynamicAopProxy或Cglib2AopProxy。
- 代理模式 (Proxy):
- AOP 的核心实现。
- 观察者模式 (Observer):
- Event System (
ApplicationListener,ApplicationEvent).
- Event System (
- 适配器模式 (Adapter):
DisposableBeanAdapter: 将 XML 配置的销毁方法适配为DisposableBean接口。
- 责任链模式 (Chain of Responsibility):
MethodInterceptor拦截器链(虽然本项目简化为单个 Interceptor,但设计上支持链式)。
- JDK 17+
- Maven 3.x
本项目通过单元测试驱动开发。核心功能验证请运行 ApiTest 和 DynamicProxyTest。
# 运行 IOC 和事件测试
mvn test -Dtest=ApiTest
# 运行 AOP 动态代理测试
mvn test -Dtest=DynamicProxyTest
# 运行 AOP 自动代理集成测试
mvn test -Dtest=AopTest感谢所有对 Spring 源码进行剖析的先驱们。本项目致敬 Spring Framework 的精妙设计。