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配置,于是我也按这个修改了,项目就神奇的正常运行了!!!!!











