Spring5.3.x源码环境构建
参考链接:https://blog.csdn.net/smart_an/article/details/107199151
准备工具
- git :拉取代码
- jdk1.8 : 最低版本1.8
- gradle :
- 下载地址: https://services.gradle.org/distributions/
- 博主使用的版本是6.8.3(gradle-6.8.3-all.zip)
- 至于怎么安装,小伙伴们可以自行百度,有很多。
- 安装后,可以使用gradle -v查看是否安装成功。
- idea:最好是高版本的idea,据说低版本会编译不成功。博主用的idea 2021.3
下载源码
码云地址:https://gitee.com/mirrors/Spring-Framework?_from=gitee_search,Fork到自己的仓库。
这里我构建是master分支,Fork到自己的仓库可以创建以master为起点的新的分支。
开始构建
1、打开idea,【open】导入项目。

2、导入项目后,Ctrl+Alt+S打开【setting】,搜索gradle,修改【Gradle user home】为自己设定的本地仓库(这里类似于指定maven的本地仓库),指定【Build and run using】和【Run test using】为IDEA,设定【Use Gradle from】读取项目中gradle.wrapper.properties文件,指定JDK为1.8。
补充: 这里的配置后续运行可能会存在问题,问题的解决方案更新在最后了,下移至附录2

3、 修改gradle.wrapper.properties文件。因为gradle每次编译都会从官网下载指定版本(gradle-6.8.3-bin.zip),所以我们在它第一次下载完之后,将distributionUrl设置成本地文件,这样就不会每次编译都从官网下载了。

4、打开build.gradle文件(这个就相当于是maven的pom文件),在文件头部加上
buildscript {
repositories {
maven { url "https://repo.spring.io/plugins-release" }
}
}

5、 继续往下,增加阿里云镜像地址:
repositories {
//新增以下3个阿里云镜像
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/repository/spring/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
maven { url "https://repo.spring.io/milestone" } // Reactor
//新增spring插件库
maven { url "https://repo.spring.io/plugins-release" }
}

6、 修改保存后会自动开始构建。(注意:这里只是把依赖包下载下来,其实还没有真正开始编译),构建完成后,可以找到ApplicationContext类,在类名上使用快捷键Ctrl+Alt+U,如果出现下图,则说明构建成功。

编译源码
编译之前,可以先阅读一下import-into-idea.md文档。

发现文档要求我们先编译spring-oxm,执行这个模块的compileTestjava指令。

编译成功!

之后,保险起见,同理依次编译一下spring-core和spring-context


最后,对整个spring项目进行build,spring->build->build

构建成功!!!

源码测试
1、新建一个自己的gradle模块

----->【next】

----->【Finish】
2、idea会自动帮我们构建模块。打开全局配置文件:settings.gradle文件,拉到最下面,我们看到系统自动加上了spring-mytest模块。

3、找到自己模块的build.gradle文件(相当于pom文件),我们需要手工添加spring-context,spring-beans,spring-core,spring-aop这4个核心模块
dependencies {
//添加完要构建一下,否则代码中无法引用
compile(project(":spring-context"))
compile(project(":spring-beans"))
compile(project(":spring-core"))
compile(project(":spring-aop"))

添加完需要构建一下,依赖引入到自己的模块中,如下图

4、在新建的模块main下,测试代码:

public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
@Configuration
@ComponentScan
public class JavaConfig {
@Bean
public User user(){
return new User(1,"cheng");
}
}
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
User user = (User)context.getBean("user");
System.out.println(user);
}
}
5、运行测试类:
成功!!! 撒花!!!

6、 至此,spring源码环境也就搭建完毕了。小伙伴们也就可以进行断点调试了!!!!
附录1:各模块的作用
核心模块:
- spring-core:依赖注入IOC和DI的最基本实现
- spring-bean:Bean工厂与装配
- spring-context:上下文,即IOC容器
- spring-context-support:对IOC的扩展,以及IOC子容器
- spring-content-indexer:类管理组件和classpath扫描
- spring-expression:表达式语句
切面:
- spring-aop:面向切面编程,CGLIB,JDKProxy
- spring-aspects:集成AspectJ,AOP应用模块
- 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-test:测试组件
集成兼容
spring-framework-bom:解决不同模块依赖版本不同问题
附录2:搭建项目时遇到的问题:
1、spring-webflux编译不通过、新建的测试模块编译不通过,报代码不规范等错误。
解决方案:
可以将spring-websocket模块下checkstyle.xml文件<moudle>标签内的格式检查都注释掉。

2、新建的测试模块,引入的依赖构建成功了,但是在代码中引用不到。(rumtimeClasspath下没有依赖)
解决方案:
gradle中点击进行reload。

3、运行测试类时,保错:

解决方案:
这个就很神奇,百度了很多,解决方案要不就是升级jdk11,要不就是安装openjdk 1.8。但是我的另一台电脑就是oracle jdk1.8,就不会出现这个问题,所以jdk的关系可以暂时排除了,于是我仔细对比了一下两台电脑项目中的配置最后发现了区别:

这是正常运行项目的电脑的gradle配置,于是我也按这个修改了,项目就神奇的正常运行了!!!!!











