使用Idea搭建Spring源码阅读环境
使用Idea搭建Spring源码阅读环境
之前一直想要拜读Spring
的源码,但是因为前段时间忙着应付学校的考试所以就一直没来得及准备。前几天总算考完了,然后准备开始看一下Spring
的源码。又因为想要自己写一点注释,然后跟着项目一步一步的Debug,所以最好还是将Spring
的源码克隆下来在本地进行测试以及添加注释比较好。
虽然看着很简单,但是在开始做这件事的时候还是走了很多弯路,浪费了不少时间,所以我将我遇到的坑记录下来,给大家做一个参考。
首先,我们需要在github上找到Spring
的仓库,点击Code
,然后将链接复制,进行克隆。但是,鉴于大家并没有魔法,所以很可能克隆项目克隆一个小时都拉不下来,大家可以先将github上的仓库导入到gitee,然后再从gitee上进行操作。
1.将GitHub上的Spring源码导入到Gitee
Github上Spring的源码地址:https://github.com/spring-projects/spring-framework
打开gitee,进入主页,点击右上角的+
号,然后选择从Github/Gitlab导入仓库
然后将上面的url复制粘贴进url里面,设置好仓库的基本信息后,开始导入。这时,只需要等待gitee官方后台导入项目就行了。
因为Spring项目代码挺多的,所以导入可能需要一定的时间,大家耐心等待便可。
出现如图所示就代表导入成功
2.将项目克隆到Idea
注意,现在Spring主分支的代码是Spring 6.x
,因为目前Spring6还处于测试阶段,而通过官网可知,目前5.3.20
才是稳定版本,所以我这里是将5.3.x
作为主分支。
更改仓库的默认分支可以在仓库的管理界面设置
这一切办妥后,我们复制仓库链接,然后打开idea
点击Idea工具栏的VCS
按钮,然后再点击如图所示:
然后我们再将刚才的url粘贴进去,点击clone
就可以了
3.构建项目
因为我们是从gitee克隆项目,所以很快我们就可以把代码拉下来。
注意,代码拉下来之后先暂时不要让idea构建项目,因为这时gradle会从Spring的官方仓库去下载项目所需要的依赖,因为仓库在国外,所以下载特别特别慢,我们还需要将项目加上镜像仓库,这样会使我们构建项目快很多
又因为Spring用的Gradle
来管理项目,所以idea会自动下载当前Spring版本所需要的Gradle版本。
Java开发这边很少使用到Gradle来构建项目,基本就是Maven,所以我们也不必再去下载一个全局的Gradle,配置环境变量啥的,我们直接让idea自己下载配置就行了。
如果,你非要自己配置,那么在项目目录下的./gradle/wrapper/gradle-wrapper.properties
中可以查看当前Spring项目所需的Geadle版本。
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-7.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl
这个参数的值就是所需的gradle版本
然后,我们还需要指定一下Spring的远程仓库,这里我们选择阿里云的镜像
首先,我们在项目目录中找到build.gradle
这个文件,在repositories
的值下面加上这两个镜像源
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
修改后如图所示:
再找到settings.gradle
这个文件,也是在repositories
加上这个镜像源
maven { url "https://maven.aliyun.com/repository/public" }
修改后如图所示:
修改这两个文件后,就可以点击配置文件右上角的刷新符号,开始构建项目了。你也可以点击最上方的Build
,然后静静的等待项目构建完成就行了。
所有模块被idea识别就代表构建成功
然后根据目录下的官方导入文档所说,我们需要在项目之前进行预编译:
我们点击idea由上级的gradle
,然后先找到spring-core
,点击如图所示的按钮进行预编译:
然后再对spring-oxm
做同样操作
最后对整个项目进行编译:
然后静静的等待项目进行编译完成就行了。
4.进行测试
编译完成后,我们可以再项目目录下创建一个自己的模块,可以在我们阅读源码期间进行测试。
选择Gradle项目,然后选好名称后finish就行了:
注意,坑爹的地方来了。
idea会自动给我们生成·build.gradle
文件,其实就像与Maven
项目的pom.xml
,我们可以在里面引入Spring的相关模块进行测试,但是因为版本原因,引入的方式与网上很多的文档大有不同
网上大多数文章是像这样导入的:
dependencies {
compile(project(":spring-context"))
compile(project(":spring-instrument"))
compile 'junit:junit:4.12'
compile group: 'org.hamcrest', name: 'hamcrest-core', version: '1.3'
}
但是idea生成的模板确实这样:
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
千万不要像网上的文章那样引入模块,因为现在Spring使用的Gradle版本早就升级到7.2.x了,所以之前的引入方式已经在高版本被弃用了,compile命令也已经被弃用,我们可以使用implementation
来引入相关的模块,比如,我现在想要引入spring-context
模块,那么我可以这样:
dependencies {
implementation(project(":spring-context"))
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
然后我们就可以使用spring容器相关的API,进行测试了.
目录结构:
我们先创建一个实体类:
package cuit.pymjl.entity;
/**
* @author Pymjl
* @version 1.0
* @date 2022/6/11 17:01
**/
public class User {
private String username;
private String password;
private String gender;
@Override
public String toString() {
return "User{" +
"username='" + username + ''' +
", password='" + password + ''' +
", gender='" + gender + ''' +
'}';
}
public User(String username, String password, String gender) {
this.username = username;
this.password = password;
this.gender = gender;
}
public User() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
然后在resource
目录下创建一个beans.xml
```
然后创建一个主启动类进行测试:
package cuit.pymjl;
import cuit.pymjl.entity.User;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author Pymjl
* @version 1.0
* @date 2022/6/11 17:05
**/
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:beans.xml");
User bean = context.getBean(User.class);
System.out.println(bean);
}
}
然后运行项目,成功输出对象:
至此,整个源码的阅读环境就搭建成功啦,希望我的文章能对你有帮助。