# hz-spring **Repository Path**: hz/hz-spring ## Basic Information - **Project Name**: hz-spring - **Description**: 手写spring,理解spring的IOC和AOP - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-13 - **Last Updated**: 2026-03-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Hz-Spring - 手写 Spring IOC 与 AOP 极简实现 这是一个手写的 Spring 框架简化版本,通过极简的代码实现了 Spring 的核心功能:**IOC(控制反转)**和 **AOP(面向切面编程)**。本项目旨在帮助开发者理解 Spring 框架的核心原理和工作机制。 ## 🎯 项目目标 - 用最简洁的代码展示 Spring 核心原理 - 帮助学习者理解 IOC 容器的实现机制 - 演示 AOP 事务管理的基本原理 - 提供一个可运行的 Spring 学习示例 ## 📦 核心功能 ### 1. IOC 容器实现 #### Bean 管理 - ✅ **BeanDefinition**:定义 Bean 的类型、作用域(singleton/prototype)、是否懒加载 - ✅ **组件扫描**:自动扫描指定包路径下带有 `@Component` 注解的类 - ✅ **依赖注入**:支持 `@Autowired` 注解进行字段注入 - ✅ **Bean 生命周期回调**:支持 `BeanNameAware` 和 `ApplicationContextAware` 接口 #### 作用域支持 - ✅ **单例模式(Singleton)**:默认模式,容器启动时创建并缓存 Bean 实例 - ✅ **多例模式(Prototype)**:每次获取都创建新实例 - ✅ **懒加载(Lazy)**:延迟到首次使用时创建 Bean ### 2. AOP 事务实现 - ✅ **@Transactional 注解**:标记需要事务管理的类 - ✅ **CGLIB 动态代理**:使用 CGLIB 生成代理对象 - ✅ **事务模拟**:在方法执行前后输出"开启事务"和"提交事务" ## 🏗️ 项目结构 ``` hz-spring/ ├── src/main/java/com/vvhz/ │ ├── springframework/ # Spring 框架核心类 │ │ ├── HzApplicationContext.java # 应用上下文(IOC 容器核心) │ │ ├── BeanDefinition.java # Bean 定义 │ │ ├── Component.java # 组件注解 │ │ ├── ComponentScan.java # 组件扫描注解 │ │ ├── Autowired.java # 自动注入注解 │ │ ├── Scope.java # 作用域注解 │ │ ├── Lazy.java # 懒加载注解 │ │ ├── Transactional.java # 事务注解 │ │ ├── BeanNameAware.java # Bean 名称感知接口 │ │ └── ApplicationContextAware.java # 应用上下文感知接口 │ └── user/ # 示例代码 │ ├── AppConfig.java # 配置类 │ ├── MyApplication.java # 启动类 │ └── service/ │ ├── UserService.java # 用户服务(带事务) │ └── OrderService.java # 订单服务 └── pom.xml ``` ## 💻 核心类说明 ### HzApplicationContext IOC 容器的核心实现类,主要功能: - **构造方法**:接收配置类,触发组件扫描和 Bean 创建 - **scan()**:扫描指定包路径,解析带有 `@Component` 的类并注册为 BeanDefinition - **createBean()**:创建 Bean 实例,处理依赖注入、生命周期回调和 AOP 代理 - **getBean()**:根据名称获取 Bean,支持单例和多例模式 ### BeanDefinition Bean 的定义信息,包含: - `type`:Bean 的类型(Class) - `scope`:作用域(singleton/prototype) - `isLazy`:是否懒加载 ## 🔧 技术栈 - **JDK 8+** - **Maven**:项目管理工具 - **CGLIB 3.3.0**:用于实现 AOP 动态代理 ## 🚀 快速开始 ### 1. 环境要求 - JDK 1.8 或更高版本 - Maven 3.x+ ### 2. 构建项目 ```bash mvn clean install ``` ### 3. 运行示例 执行 `MyApplication` 类的 main 方法: ```java public static void main(String[] args) { HzApplicationContext applicationContext = new HzApplicationContext(AppConfig.class); UserService userService = (UserService) applicationContext.getBean("userService"); userService.test(); } ``` ### 4. 输出结果 ``` 开启事务 com.vvhz.user.service.OrderService@694f9431 com.vvhz.springframework.HzApplicationContext@f2a0b8e userService 提交事务 ``` ## 📝 使用示例 ### 定义 Service ```java @Component @Transactional public class UserService implements BeanNameAware, ApplicationContextAware { @Autowired private OrderService orderService; private HzApplicationContext applicationContext; private String beanName; @Override public void setApplicationContext(HzApplicationContext applicationContext) { this.applicationContext = applicationContext; } @Override public void setBeanName(String name) { this.beanName = name; } } ``` ### 配置类 ```java @ComponentScan("com.vvhz.user") public class AppConfig { } ``` ## 🎓 学习要点 通过本项目,你可以学习到: 1. **IOC 容器的工作原理** - 如何扫描包路径并解析 Bean 定义 - 如何创建和管理 Bean 实例 - 如何实现依赖注入 2. **Bean 的生命周期** - Bean 的实例化过程 - Aware 接口的回调机制 - 单例和多例模式的区别 3. **AOP 的实现方式** - CGLIB 动态代理的使用 - 如何通过注解实现事务管理 - 代理对象的创建过程 4. **Spring 的设计思想** - 约定优于配置 - 注解驱动的编程模型 - 容器化管理的理念 ## ⚠️ 注意事项 本项目是一个教学性质的简化版本,主要用于学习理解 Spring 原理。真实的 Spring 框架还包含更多复杂的功能: - 更完善的 Bean 生命周期管理 - 更多的注解支持(@Qualifier、@Primary、@Value 等) - 更复杂的循环依赖解决机制 - AOP 切点表达式、通知类型等 - 事件机制、资源管理、国际化等 ## 📚 扩展建议 如果你想进一步完善这个项目,可以考虑添加: - [ ] `@Qualifier` 注解支持按名称注入 - [ ] `@Value` 注解支持属性值注入 - [ ] 循环依赖的检测和解决 - [ ] Bean 的后置处理器(BeanPostProcessor) - [ ] 基于 XML 的配置方式 - [ ] 更完善的 AOP 切点表达式 - [ ] 工厂模式和工厂方法模式 ## 👨‍💻 作者 这是一个用于学习 Spring 源码原理的教学项目 ## 📄 License MIT License --- **💡 提示**:建议在学习 Spring 官方文档的同时配合本项目使用,先通过本项目理解核心概念,再深入学习 Spring 源码会事半功倍!