松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里--> Spring Boot+Vue+微人事视频教程
最近每周和小伙伴们分享一篇 Spring 源码文章,不知不觉已经连着发了 5 篇啦:
Spring 源码解读计划
Spring 源码第一篇开整!配置文件是怎么加载的?
Spring 源码第二弹!XML 文件解析流程
Spring 源码第三弹!EntityResolver 是个什么鬼?
Spring 源码第四弹!深入理解 BeanDefinition
老实说,松哥写这五篇文章的时候,为了图方便,我就没在本地搭建 Spring 源码环境,因为在 IDEA 里边通过 Maven 依赖也可以方便的下载 Spring 源码,我就用了这种方式。
但是后来搞着搞着,有的时候想在源码上写点注释却写不了,因为通过 Maven 依赖的方式下载的 Spring 源码是只读的,没法修改,有的时候想自己修改一下看看效果也不方便。
所以想了想还是花点时间搭建一个 Spring 源码环境吧,也不费啥事。要做就做专业的,毕竟要做 Spring 源码分析系列文章,搭建一个 Spring 源码环境也是应该的。
那就搞起!
Spring 源码仓库地址是:https://github.com/spring-projects/spring-framework。
大家可以直接下载 zip 压缩包,也可以 clone,建议通过 clone 的方式获取源码,这样方便切换到不同的分支查看不同时期的代码。
直接从 GitHub 上 clone 源码有点慢,所以我们可以先在自己的 Gitee 账户上新建一个仓库,新建的仓库选择从【从 GitHub/GitLab 导入仓库】,将 Spring 源码仓库导入到自己的 Gitee 上,然后再从 Gitee 上 clone,clone 速度提升十倍以上。
当然,如果小伙伴们懒得在 Gitee 上搞这一套,松哥现在已经弄好了,你也可以直接从下面这个地址 clone:
https://gitee.com/lenve/spring-framework
代码 clone 应该都会吧?算了本着手把手的原则,我还是说一下,执行如下命令 clone 代码:
git clone https://gitee.com/lenve/spring-framework
最新版的 Spring 源码是基于 Gradle 来构建的,松哥 2016 年那会搞 Android 的时候,Gradle 经常使用,现在搞 Java 后,还是以 Maven 为主,Gradle 使用稍微少一些。这里我们先来解决 Gradle 的问题。
有两种办法:
在电脑本地安装。
加载 Spring 源码时当场安装。
无论哪种方式,建议都安装适合 Spring 源码的版本,避免后期一些不必要的问题。
Spring 源码 clone 下来之后,大家在 spring-framework/gradle/wrapper/gradle-wrapper.properties
文件中,我们可以看到当前源码使用的 Gradle 版本:
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https/://services.gradle.org/distributions/gradle-6.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists
distributionUrl 中就是你要下载的 Gradle 地址,从中就可以看出 Gradle 版本号。
如果你想采用第一种方式安装 Gradle,就使用 distributionUrl 给出的地址去下载对应的 Gradle,下载成功后,解压,配置环境变量即可。这个比较简单,我就不多说了。
如果你想采用第二种方式,那么现在什么都不用做,一会导入项目的时候会自动下载 Gradle(松哥这里图省事采用这种方式)。
默认路径下载依赖构建项目比较慢,所以源码下载下来之后,我们首先进入到 build.gradle 文件中,添加下载源(原有的保留,添加 Alibaba 下载源):
repositories { maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} }
接下来打开 IDEA,导入 Spring 源码,注意选择 Import Project:
注意各个选项不要选择错了:
项目导入成功之后,接下来会去下载相关依赖,这个过程所耗费的时间视网络情况而定。
依赖都下载之后,接下来编译项目,在菜单栏选择 Build->Build Project,或者直接点击:hammer:图标进行编译,如下:
编译成功后,每个项目下都会多出一个 build 目录,相当于 Maven 里边的 target,如下:
接下来我们来添加一个 module,来使用一下这些源码。
项目右键单击,选择 New->Module:
选择 Gradle 创建一个 Java 项目:
给 module 取一个名字:
在新创建的 module 的 build.gradle 文件中,我们添加 spring-context 依赖,这个相当于 Maven 中的 pom.xml:
dependencies { compile(project(":spring-context")) testCompile group: 'junit', name: 'junit', version: '4.12' }
接下来我们写一个简单的 spring-context 的测试看一下。
首先创建一个 User 类:
public class User { private String username; private String address; @Override public String toString() { return "User{" + "username='" + username + '/'' + ", address='" + address + '/'' + '}'; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
然后创建 resources/beans.xml 文件,配置该 Bean:
<?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="org.javaboy.test.User" id="user"> <property name="username" value="javaboy"/> <property name="address" value="www.javaboy.org"/> </bean> </beans>
最后创建测试方法:
public class Main { public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:beans.xml"); User user = ctx.getBean(User.class); System.out.println("user = " + user); } }
运行该方法,结果如下:
如此,我们本地的 Spring 源码环境就算是搭建成功了。
非常幸运,很多小伙伴反映的搭建 Spring 源码的问题我竟然一个都没遇到!
感兴趣的小伙伴可以试试松哥上面给出的方案。