作为一名Java开发人员,和Spring打交道的次数可能比陪女朋友还多。况且Spring现在不仅仅是一个框架,同时也是Java行业的标准。面试当中关于Spring的问题也是多不胜数。所以对于Java开发人员学习Spring源码,理解Spring底层变得尤为重要。
本文就针对学习Spring源码的第一步: windows下编译Spring4.3.12源码,导入Idea。
搭建环境
Spring源码使用的是Gradle 进行构建的,所以需要下载 Gradle 以及搭建 java开发环境
Java环境使用的是 JDK1.8

Gradle版本5.2.1 Gradle下载

上面的下载和安装都比较简单, 不在赘述。
下载Spring源码
Spring源码下载

下载zip文件到本地后解压。
开始编译
- 进入Spring源码目录
cd spring-framework-4.3.21.RELEASE - 编译
spring-oxm使用命令gradlew :spring-oxm:compileTestJava(这一步执行了6分钟)

- 执行
gradlew idea -x test编译整个spring-framework为idea项目 (-x test是 不进行测试代码的编译, 我在执行这一步时就忘记了, 导致后面test大量出错, 完全跑不起来)
这一步会下载许多的依赖, 执行了快30分钟

如果是eclipse项目 :编译为eclipse项目 , 不过个人建议还是使用idea。会少些折腾。
导入idea
编译完成之后在根目录下会有一个 spring.ipr 文件

使用idea打开这个文件就可以将所有 module 导入idea 当中.
文件夹上有个 蓝色的标记 表明已经导入完成。(如图)

这一步我并没有碰到网上说的一些其他的一些毛病. 还算比较顺利
测试
编译完成了, 接下来就是如和使用我们自己编译的spring程序,使我们在debug时直接到代码内部当中。
首先建一个测试的module, 我这里创建了一个maven module (对gradle不是很熟悉)

然后在 pom.xml 中添加依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
File > Project Structure 添加spring的依赖

这里+展开后需要选择 Module dependency
这里有可能会出现一个 spring module not exist .... 的错误. 直接将对应的模块移出就好。
这里具体需要依赖什么取决于测试程序, 如果提示有其他的包找不到,添加进来即可 , 可以自行测试一下。
依赖添加完成之后,就可以进行测试了。我们就直接将一个类添加到 ioc 当中,然后在从 ioc 当中取出来。
创建一个Student.java
package top.gn.entity;
import org.springframework.stereotype.Component;
/**
* 学生类
*/
@Component
public class Student {
private Integer id;
//学号
private String schoolNum;
private Character sex;
public Student() {
this(1,"16234",'男');
}
public Student(Integer id, String schoolNum, Character sex) {
this.id = id;
this.schoolNum = schoolNum;
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", schoolNum='" + schoolNum + '\'' +
", sex=" + sex +
'}';
}
}
在 resources --> ApplicationContext.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="top.gn.entity"/>
</beans>
主程序 App.java
package top.gn;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import top.gn.entity.Student;
/**
* 测试自己编译的spring
*
*/
public class App
{
public static void main( String[] args )
{
ApplicationContext app = new ClassPathXmlApplicationContext("ApplicationContext.xml");
Student student = app.getBean(Student.class);
System.out.println(student);
}
}
我们可以进入 ClassPathXmlApplicationContext.java 当中 在其中加入一条输出语句.

执行结果 :

这样我们在学习spring源码时就可以 对其中方法 变量, 添加自己的注释。 使用debug时也更加的清晰。

本文介绍如何在Windows环境下使用Gradle构建Spring 4.3.12源码,并导入IntelliJ IDEA进行开发。文章详细记录了搭建Java和Gradle环境、下载Spring源码、编译过程及常见问题解决方法。
1205





