一个精简版的 Spring 框架实现,用于学习 IoC、DI 和 AOP 原理。
- 代码量控制:核心代码约 1400 行,易于理解和学习
- 功能完整:实现了 Spring 框架的核心功能
- 最佳实践:遵循 Spring 框架的设计模式和最佳实践
-
IoC 容器
ApplicationContext作为容器核心- 支持单例(singleton)和原型(prototype)作用域
- 支持懒加载(@Lazy)
-
依赖注入 (DI)
- 字段注入(@Autowired)
- 构造函数注入(@Autowired)
- 按类型自动匹配
- 按名称注入(@Qualifier)
- 可选依赖(@Autowired(required=false))
-
Bean 生命周期管理
- 初始化回调(@PostConstruct)
- 销毁回调(@PreDestroy)
- 支持通过 BeanDefinition 配置初始化/销毁方法
-
组件扫描
- 基于注解(@Component)的自动扫描
- 支持 @Scope 和 @Lazy 注解
-
AOP 面向切面编程
- 基于 JDK 动态代理
- 前置通知(@Before)
- 后置通知(@After)
- 切点表达式匹配
# 编译项目
mvn clean compile
# 运行演示程序
mvn exec:java -Dexec.mainClass="com.minispring.demo.App"演示程序位于 com.minispring.demo 包下,包含:
-
UserRepository - 用户数据访问层
- 演示:@Component、单例模式、@PostConstruct
-
UserService - 用户服务层
- 演示:字段注入、AOP 代理
-
OrderService - 订单服务
- 演示:构造函数注入、@Qualifier、原型作用域
-
LoggingAspect - 日志切面
- 演示:AOP 切面编程
-
DatabaseConfig - 数据库配置
- 演示:@PostConstruct 和 @PreDestroy 生命周期回调
@Component
public class UserService {
@Autowired
private UserRepository userRepository;
// 业务方法...
}ApplicationContext context = new ApplicationContext("com.example.demo");// 按类型获取
UserService service = context.getBean(UserService.class);
// 按名称获取
UserService service = context.getBean("userService", UserService.class);@Component
@Aspect
public class LoggingAspect {
@Before("com.example.service.UserService.*")
public void beforeMethod() {
System.out.println("方法执行前...");
}
@After("com.example.service.UserService.*")
public void afterMethod() {
System.out.println("方法执行后...");
}
}- Java 17 (LTS 版本)
- Maven 3.8+ 构建工具
- JUnit 5 测试框架(可选)
- SLF4J + Logback 日志(可选)
src/main/java/com/minispring/
├── beans/ # Bean 相关
│ └── factory/ # BeanFactory 接口和实现
├── context/ # 应用上下文
├── aop/ # AOP 相关
├── stereotype/ # 注解定义
└── demo/ # 演示程序
├── model/ # 实体类
├── repository/ # 数据访问层
├── service/ # 服务层
├── aspect/ # 切面类
└── config/ # 配置类
-
JDK 动态代理限制:只能代理实现了接口的类。如果类没有实现接口,将无法创建代理对象。
-
类型转换:由于 AOP 代理,获取 Bean 时建议使用接口类型而不是具体类类型。
-
循环依赖:框架会检测循环依赖并抛出异常。
- 从
ApplicationContext开始,理解容器的核心机制 - 研究
ClassPathBeanScanner,了解组件扫描的实现 - 查看
AopProxy,理解动态代理的工作原理 - 运行演示程序,观察框架的实际运行效果
本项目仅用于学习目的。