使用Idea搭建Spring源码阅读环境

2,001 阅读5分钟

使用Idea搭建Spring源码阅读环境

之前一直想要拜读Spring的源码,但是因为前段时间忙着应付学校的考试所以就一直没来得及准备。前几天总算考完了,然后准备开始看一下Spring的源码。又因为想要自己写一点注释,然后跟着项目一步一步的Debug,所以最好还是将Spring的源码克隆下来在本地进行测试以及添加注释比较好。

虽然看着很简单,但是在开始做这件事的时候还是走了很多弯路,浪费了不少时间,所以我将我遇到的坑记录下来,给大家做一个参考。

首先,我们需要在github上找到Spring的仓库,点击Code,然后将链接复制,进行克隆。但是,鉴于大家并没有魔法,所以很可能克隆项目克隆一个小时都拉不下来,大家可以先将github上的仓库导入到gitee,然后再从gitee上进行操作。

1.将GitHub上的Spring源码导入到Gitee

Spring 官网

Github上Spring的源码地址:github.com/spring-proj…

打开gitee,进入主页,点击右上角的+号,然后选择从Github/Gitlab导入仓库

image-20220614193537298

然后将上面的url复制粘贴进url里面,设置好仓库的基本信息后,开始导入。这时,只需要等待gitee官方后台导入项目就行了。

因为Spring项目代码挺多的,所以导入可能需要一定的时间,大家耐心等待便可。

image-20220614193909120

出现如图所示就代表导入成功

2.将项目克隆到Idea

注意,现在Spring主分支的代码是Spring 6.x,因为目前Spring6还处于测试阶段,而通过官网可知,目前5.3.20才是稳定版本,所以我这里是将5.3.x作为主分支。

更改仓库的默认分支可以在仓库的管理界面设置

这一切办妥后,我们复制仓库链接,然后打开idea

点击Idea工具栏的VCS按钮,然后再点击如图所示:

image-20220614194418152

然后我们再将刚才的url粘贴进去,点击clone就可以了

image-20220614194518978

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'}

修改后如图所示:

image-20220614195816629

再找到settings.gradle这个文件,也是在repositories加上这个镜像源

maven { url "https://maven.aliyun.com/repository/public" }

修改后如图所示:

image-20220614200023547

修改这两个文件后,就可以点击配置文件右上角的刷新符号,开始构建项目了。你也可以点击最上方的Build,然后静静的等待项目构建完成就行了。

所有模块被idea识别就代表构建成功

image-20220614200250390

然后根据目录下的官方导入文档所说,我们需要在项目之前进行预编译:

image-20220614200640548

我们点击idea由上级的gradle,然后先找到spring-core,点击如图所示的按钮进行预编译:

image-20220614200815016

然后再对spring-oxm做同样操作

最后对整个项目进行编译:

image-20220614200926103

然后静静的等待项目进行编译完成就行了。

4.进行测试

编译完成后,我们可以再项目目录下创建一个自己的模块,可以在我们阅读源码期间进行测试。

image-20220614201105100

选择Gradle项目,然后选好名称后finish就行了:

image-20220614201144422

注意,坑爹的地方来了。

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,进行测试了.

目录结构:

image-20220614202152624

我们先创建一个实体类:

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="cuit.pymjl.entity.User" id="user">
        <property name="username" value="pymjl"/>
        <property name="gender" value="nan"/>
        <property name="password" value="123456"/>
    </bean>
</beans>

然后创建一个主启动类进行测试:

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);
    }
}

然后运行项目,成功输出对象:

image-20220614202244766

至此,整个源码的阅读环境就搭建成功啦,希望我的文章能对你有帮助。