开个帖子记录一下自己学spring源码的过程
一、写在开头
简单记录下来时路,以后也能回头看看鼓励下自己。我以前不喜欢拍照,觉得没什么意思,有一天百度云盘给我推不知道什么时候从相册推到百度云相册的照片,那是我口罩时期在家上体育课的照片,我现在回头望过去觉得那时很幸福。现在后悔以前没怎么拍照片,想回忆起过去只能靠脑袋里的记忆,但随着时间是越来越模糊。
说多了,现在开始记录spring源码的学习过程吧
二、正式开始
2025年5月7日00:07:27
🌱 初识 Spring:为什么我们需要它?
在早期开发 Java 企业级应用时,程序员需要手动处理很多琐碎的事情,比如:
- 对象的创建和管理(谁来 new?谁来管理生命周期?)
- 多个模块之间的依赖关系如何连接?
- 业务逻辑和日志、权限控制等“杂事”混杂在一起,维护难度很高
于是,Spring 框架就登场了。它就像一个万能工具箱,为我们解决了这些问题,让开发工作更简单、高效。
🧰 Spring 能做什么?简单点说就是这几点:
- 帮你管理对象(Bean):你不需要自己去创建、管理对象,Spring 会代劳。
- 解耦合:模块之间不再直接依赖,而是通过 Spring 容器连接,改起来更灵活。
- 提供事务、消息、远程调用等强大功能:而且整合了主流框架(如 MyBatis、JPA)。
- 可以像切洋葱一样“切”功能:用 AOP 把权限、日志、监控从业务逻辑中分离。
- 开放灵活:你可以只用 Spring 的一部分,不需要全盘接入。
🔧 Spring 的核心理念:IOC 与 AOP
🧩 IOC(控制反转)
简单理解:你不再负责 new 对象,Spring 来做这事。
以前你这样写代码:
UserService service = new UserServiceImpl();
现在你只要告诉 Spring:“我要个 UserService”,Spring 会自动帮你创建、配置好:
@Autowired
private UserService userService;
这就是依赖注入(DI),是 IOC 的一种实现方式。
🪚 AOP(面向切面编程)
比如你有这样的代码:
public void placeOrder() {log();checkPermission();doBusinessLogic();
}
这些日志、权限和真正的业务混在一起,不好维护。
用 AOP,你可以把“日志”“权限”这些通用功能“切出去”:
@Log
@CheckPermission
public void placeOrder() {doBusinessLogic();
}
🏗️ Spring 的结构是怎样的?
你可以把 Spring 看作一座大楼,每一层都负责不同的工作,从基础设施到高级服务。
第1层:核心容器 Core Container(基础设施层)
这是 Spring 的地基,负责“管理对象”这件事:
- spring-core:IOC/DI 的核心实现
- spring-beans:负责读取配置、管理 Bean 的生命周期
- spring-context:提供类似“应用上下文”的功能,像是 Spring 的运行环境
- spring-expression:可以写复杂表达式动态操作对象(比如
#{user.age > 18}
)
第2层:数据访问层(JDBC、ORM 等)
用于操作数据库:
- spring-jdbc:简化传统 JDBC 编程(不用再写 try-catch-finally)
- spring-orm:整合 JPA、Hibernate、MyBatis 等 ORM 框架
- spring-tx(事务):帮你自动管理事务(不用自己写 commit/rollback)
第3层:Web 支持(Servlet、MVC、WebSocket 等)
- spring-web:支持 Web 项目、文件上传、IoC 初始化
- spring-webmvc:核心的 MVC 实现,适合开发 REST API 或传统 Web 应用
- spring-websocket:支持实时双向通信(聊天、直播场景)
- spring-portlet:为基于 Portlet 的环境提供支持(较少使用)
第4层:切面编程与工具层
- spring-aop:支持定义切面、切点和通知
- spring-aspects:整合 AspectJ 框架(AOP 更强大)
- spring-instrument:用于类加载优化(主要用于服务器部署)
- spring-messaging:消息协议支持(如 STOMP + WebSocket)
第5层:测试支持
- spring-test:方便用 JUnit 或 TestNG 测试 Spring 应用
🧱 总结一句话:
Spring 是一个分层、模块化的“开发大工厂”,核心是 用容器管理对象(IOC),并通过 切面编程(AOP)实现对业务代码的“功能增强”。你可以只用你需要的那部分,逐步深入。