作为一名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时也更加的清晰。