Skip to content

JustCod101/mini-spring

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 

Repository files navigation

Mini-Spring: 手写极简 Spring 框架

The Philosophy of Design (设计哲学)

"What I cannot create, I do not understand." — Richard Feynman

1. 项目简介 (Introduction)

mini-spring 是一个用于学习和理解 Spring 核心原理的实验性项目。 这不是一个生产级的框架,而是一个解构 Spring 的过程。我们剥离了 Spring 庞杂的细节,保留了最核心的 IOC (控制反转)AOP (面向切面编程) 骨架。

本项目特别适合:

  • 希望深入理解 Spring 源码但面对几十万行代码无从下手的开发者。
  • 偏好 "First Principles" (第一性原理) 思维,想要探究 "Why" 而不仅仅是 "How" 的架构师。
  • 需要复习设计模式在实际框架中应用的工程师。

2. 核心特性 (Features)

  • IOC Container: 完整的 Bean 生命周期管理(定义、注册、实例化、初始化、销毁)。
  • Dependency Injection: 支持属性注入、依赖注入(Bean 引用)。
  • Resource Loading: 统一资源加载策略(ClassPath, FileSystem, URL)。
  • XML Configuration: 支持从 spring.xml 解析 Bean 定义。
  • Extension Points: 实现了 BeanFactoryPostProcessorBeanPostProcessor,支持容器扩展。
  • Event System: 基于观察者模式的容器事件机制(ApplicationEvent, Listener, Multicaster)。
  • AOP: 基于 AspectJ 表达式的切点匹配,支持 JDK 动态代理和 CGLIB 代理,实现自动代理(Auto-Proxy)。

3. 架构设计 (Architecture)

3.1 IOC 容器核心流程

+----------------+          +-----------------------+          +----------------+
| BeanDefinition | <------- | BeanDefinitionRegistry|          |  BeanFactory   |
| (配方/元数据)    |          |       (注册中心)       |          |    (生产工厂)    |
+----------------+          +-----------------------+          +----------------+
        ^                               |                              ^
        |                               v                              | (get)
+----------------+          +-----------------------+          +----------------+
| ResourceLoader | -------> |  BeanDefinitionReader | -------> |  Instantiated  |
| (资源加载器)     |          |       (读取与解析)     |          |      Bean      |
+----------------+          +-----------------------+          +----------------+

3.2 AOP 代理核心流程

+-----------+      +-------+
|  Pointcut | ---> | Class |
| (匹配规则)  |      | Method|
+-----------+      +-------+
      ^
      |
+-----------+      +---------+
|  Advisor  | <--- | Advice  |
| (切面组合)  |      | (增强逻辑)|
+-----------+      +---------+
      |
      v
+------------------------+      +---------------------+
| DefaultAdvisorAutoProxy| ---> |   AopProxyFactory   |
|       Creator          |      | (JDK / CGLIB Strategy)|
+------------------------+      +---------------------+
                                           |
                                           v
                                     +-------------+
                                     | Proxy Object|
                                     +-------------+

4. 项目结构 (Project Structure)

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)

5. 演进路线 (Development Phases)

本项目按照由简入繁的顺序开发,建议阅读 commit history 或按以下顺序学习:

  • Phase 1: Skeleton - 定义 BeanDefinition 和 BeanFactory 接口,确立“元数据驱动”的设计思想。
  • Phase 2: Simple Factory - 实现 DefaultListableBeanFactory,利用模板方法模式完成单例 Bean 的创建和获取。
  • Phase 3: Dependency Injection - 实现属性填充(populateBean),解决 Bean 之间的依赖引用。
  • Phase 4: Resource & XML - 引入 ResourceLoaderXmlBeanDefinitionReader,实现从 XML 文件启动容器。
  • Phase 5: ApplicationContext - 引入应用上下文,实现 BeanFactoryPostProcessorBeanPostProcessor 扩展点。
  • 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。

6. 设计模式应用 (Design Patterns)

  • 模板方法模式 (Template Method):
    • AbstractBeanFactory: 定义 getBean 的标准流程,将 createBean 留给子类。
    • AbstractApplicationContext: 定义 refresh 的标准启动流程。
  • 策略模式 (Strategy):
    • InstantiationStrategy: 选择 JDK 反射或 CGLIB 进行实例化。
    • AopProxy: 选择 JdkDynamicAopProxyCglib2AopProxy
  • 代理模式 (Proxy):
    • AOP 的核心实现。
  • 观察者模式 (Observer):
    • Event System (ApplicationListener, ApplicationEvent).
  • 适配器模式 (Adapter):
    • DisposableBeanAdapter: 将 XML 配置的销毁方法适配为 DisposableBean 接口。
  • 责任链模式 (Chain of Responsibility):
    • MethodInterceptor 拦截器链(虽然本项目简化为单个 Interceptor,但设计上支持链式)。

7. 快速开始 (Getting Started)

环境要求

  • JDK 17+
  • Maven 3.x

运行测试

本项目通过单元测试驱动开发。核心功能验证请运行 ApiTestDynamicProxyTest

# 运行 IOC 和事件测试
mvn test -Dtest=ApiTest

# 运行 AOP 动态代理测试
mvn test -Dtest=DynamicProxyTest

# 运行 AOP 自动代理集成测试
mvn test -Dtest=AopTest

8. 致谢

感谢所有对 Spring 源码进行剖析的先驱们。本项目致敬 Spring Framework 的精妙设计。

About

一个用于学习和理解 Spring 核心原理的实验性项目

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages