Spring源码 02 项目搭建
环境信息
- JDK 17.0.2
- Gradle 7.4
- IntelliJ IDEA 2021.3.2
获取项目
GitHub 搜索
访问 GitHub 官网:https://github.com/
输入 spring
选择 spring-projects / spring-framework
Spring 官网跳转
访问 Spring 官网:https://spring.io/
点击 Spring Framework
点击 GitHub 图标
代码下载
同步到 Gitee
由于 GitHub 网络限制,可以先导入到 Gitee 后再从 Gitee 克隆项目。
导入 Gitee 后,可以选择同步源项目获取最新的项目代码
此操作会覆盖当前代码,导致写的注释和测试类消失,非必要情况建议不同步。
下载压缩包
由于 GitHub 网络限制,直接通过地址克隆会非常缓慢,可以下载压缩包。
编译项目
克隆 Gitee 项目或者打开解压后的压缩包可以加载项目
JDK 版本
该版本 Spring 要求的最低 JDK 版本为 8,适配的最高 JDK 版本为 17。
建议使用 JDK 17 构建,可以避免一些兼容性问题。
需要在这些位置设置统一的 JDK 版本
Gradle 版本
该项目使用 Gradle,建议本地版本大于等于项目使用的版本。
如果本地版本小于项目使用的版本,会自动去下载匹配的版本,这样不方便配置国内镜像库,构建会非常缓慢。
查看项目匹配的 Gradle 版本
配置 Gradle
问题处理
Aspect 报错
描述
构建整个项目时报如下错误:
java: 找不到符号
符号: 类 AnnotationCacheAspect
位置: 类 org.springframework.cache.aspectj.AspectJCachingConfiguration
原因
AnnotationCacheAspect.aj
不是 Java 文件,javac
编译时识别不了,需要另外的aspectj
进行处理。
解决
更改 Gradle 配置
使用 Gradle 构建和运行
Gradle 中集成了 AspectJ 编译插件,使用 Gradle 可以编译通过。
Reload 项目
再次构建就不会报 Aspect 错误了。
缺点
该方法可以很方便的解决 Aspect 报错问题,但由于 Gradle 的编译和运行速度都比 IDEA 慢,会导致运行项目比较缓慢,影响效率。
使用 AspectJ 编译
下载 AspectJ
-
点击下载 AspectJ 的 jar 包。
- 选择国内镜像,下载会快很多。
安装 AspectJ
- 在 AspectJ 的 jar 包所在目录打开命令行,运行
java -jar aspectj-1.9.6.jar
命令,会弹出 AspectJ 的安装界面,点击下一步。
- 选择 JDK 的安装路径,点击下一步。
- 接着选择 AspectJ 的安装路径,点击安装。
IDEA 配置 AspectJ
- 安装 AspectJ 插件
-
将编译器改为 Ajc,接着设置 AspectJ 的安装路径,选择 aspectjtools.jar。
-
一定要将 Delegate to Javac 选项打勾。
勾选这个代理设置则只对指定的项目进行 Ajc 编译,其他的项目还是用默认的 Javac 编译。
如果不勾选,则全部项目都使用 Ajc 编译,可能会导致编译错误。
指定需要使用 Ajc 编译的项目
上面设置了只对指定的项目进行 Ajc 编译,这里就需要指定对应项目。
- 选择 spring.spring-aop.main
- 选择 spring.spring-aspects.main
指定 Ajc 编译项目的 JDK 版本
- 查看 Ajc 编译支持的 JDK 版本
- 添加 spring.spring-aop.main 和 spring.spring-aspects.main 并选择指定 JDK 版本
再次构建
再次构建就不会报 Aspect 错误了。
测试类报错
Spring 项目中有些测试类可能会出现一些错误,删除即可,不会影响编译和功能。
项目结构
主要模块
- spring-core:核心模块,依赖注入 DI 的最基本实现。
- spring-beans:Bean 工厂与装配。
- spring-context:上下文,即 IOC 容器。
- spring-context-support:对 IOC 的扩展。
- spring-context-indexer:类管理组件和 Classpath 扫描。
- spring-expression:表达式语句。
切面编程
- spring-aop:面向切面编程。
- spring-aspects:集成 AspectJ。
- spring-instrument:动态 Class Loading 模块。
数据访问与集成
- spring-jdbc:提供 JDBC 主要实现模块,用于简化 JDBC 操作。
- spring-tx:spring-jdbc 事务管理。
- spring-orm:主要集成 Hibernate,JPA,JDO 等。
- spring-oxm:将 Java 对象映射成 XML 数据或将 XML 映射为 Java 对象。
- spring-jms:发送和接受消息。
WEB 组件
- spring-web:提供了最基础的 WEB 支持,主要建立在核心容器上。
- spring-webmvc:实现了 spring mvc 的 WEB 应用。
- spring-websocket:主要与前端页的全双工通讯协议。
- spring-webflux:一个新的非阻塞函数式 Reactive Web 框架。
报文
- spring-messaging:4.0 加入的模块,主要集成基础报文传送应用。
测试
- spring-test:测试组件。
集成兼容
- framework-bom:解决不同模块依赖版本不同问题。
我的项目
Gitee 地址:https://gitee.com/liao-hang/spring-framework.git
参考
https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click
https://www.bilibili.com/video/BV12Z4y197MU?spm_id_from=333.999.0.0
《Spring源码深度解析(第2版)》
版本
Spring 5.3.15
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)