前言
从本篇文章开始,我们将开始介绍spring-framework的整体架构以及源码分析环境搭建,俗话说磨刀不误砍柴工,一定要把本地环境搭建好才方便后续我们调试代码。
spring-framework架构
spring-frame目前已经更新到6.1.x,6.0以上的版本需要运行在JDK 17+的版本。而5.0的版本需要JDK8+的版本,并且对于JDK11也提供了JDK11的支持。spring-framework各版本的生命周期情况如下所示
spring-framework总共大约有20多个模块构成,共计大约125万行代码,可以被分为下面几个模块
- Core Container
Core Container模块包含Core、Beans、Context和Expression Language子模块。其中Core和Beans模块是框架的基础部分,它提供IOC和依赖注入特性。
子模块 | 包名 | 功能 |
---|---|---|
Core | spring-core | 主要包含Spring框架基本核心工具类,Spring的其他组件都要使用到这个包里的类,Core模块是其他组件的基础 |
Beans | spring-beans | 所有引用都会用到的模块,它包含对配置文件的访问、创建和Bean的管理以及进行控制反转(IOC)和依赖注入(DI)操作相关的类 |
Context | spring-context | 它依赖Core和Beans提供的能力,但是它又提供了很多扩展功能包括国际化、事件传播、资源加载等 |
Expression | spring-expression | 提供了一个用于在运行时查询和操作对象的强大的表达式语言 |
- Data Access/Integration
Data Access/Integration模块包含JDBC、ORM、OXM、JMS和Transaction子模块。
子模块 | 包名 | 功能 |
---|---|---|
JDBC | spring-jdbc | 提供了JDBC的分装,消除了冗长的JDBC编码和解析数据库厂商特有的编码错误代码 |
ORM | spirng-orm | 为流行的对象-关系映射API,如JPA、JDO、Hibernate、Mybatis等 |
OXM | spring-oxm | 提供了一个对Object/XML映射实现的抽象层,Object/XML映射实现包括JAXB、Castor、XMLBeans、JiBX和XStream |
JMS | spring-jms | Java Messaging Service模块,它主要包含了执照和消费消息的特性 |
Transactions | spring-tx | 事务模块,它支持编程和声明式的事务管理 |
- Web
Web模块包含了WebSocket、WebMVC、Web和WebFlux子模块
子模块 | 包名 | 功能 |
---|---|---|
WebSocket | spring-websocket | 提供了对WebSocket的支持,WebSocket协议提供了一个标准化的客户端和服务器之间建立犬双攻双向通信的方法,通过TCP协议进行连接 |
WebMVC | spring-mvc | 包含了Spring的model-view-contrller(MVC)的视线 |
Web | spring-web | 提供了基本的面向Web的集成特性。例如多文件上传、使用servlet listeners初始化IOC容器以及一个面向Web应用的上下文 |
WebFlux | spring-webflux | 提供了运行在非阻塞式服务器的基于响应式流(Reactive Streams)API的响应式堆栈(reactive-stack)应用,例如Netty,Undertow和Servlet容器 |
- AOP
AOP模块提供了一个符合AOP标准的面向切面的编程实现,可以通过AOP订立方法拦截器和切点,将代码逻辑分开,降低他们之间的耦合性。它包含两个包spring-aop
和spring-aspects
环境搭建
开发环境
- Gradle
- Jdk1.8+
- Idea 2023.1
源码准备
建议大家使用gitee,支持国产,速度也快,体验相当好
打开gitee,右上角点击"从GitHub/GitLab导入仓库"
选择从URL导入,然后复制Spring-Framework的地址Spring-Framework仓库地址,输入项目相关信息后点击导入,导入完成后就可以将代码clone到本地
代码下载到本地之后,一定要切换到要分析的源码版本分支,本系列文章使用的分支是5.1.x
将项目工程导入主要分为如下步骤
-
打开Terminal,通过下面命令预编译
spring-oxm
./gradlew :spring-oxm:compileTestJava
这个过程超级漫长,强烈建议不要在电脑旁边等待,容易怀疑人生,可以去睡个觉,醒来再看有没有编译好
如果看到下面的BUILD SUCCESSFUL
就说明编译完成,可以使用Idea打开了,可以看到笔者用了23分7秒才编译完成
- 将工程导入IntelliJ
使用Idea打开项目,选择build.gradle然后再打开即可
运行示例代码
我们可以运行spring-framework
中的单元测试来验证我们环境搭建是否正常,我们可以在spring-context
项目中src/test/java/example
中找一些单元测试,我们可以调试org.springframework.beans.factory.annotation.BridgeMethodAutowiringTests#SPR8434
,其源码如下
执行单元测试后没有报错,说明环境搭建正常
Spring 官方也提供了将Spring工程导入Idea的文档可以参考《import-into-idea》