在Win10下编译Spring4.3.12源码,并导入idea, 进行测试

作为一名Java开发人员,和Spring打交道的次数可能比陪女朋友还多。况且Spring现在不仅仅是一个框架,同时也是Java行业的标准。面试当中关于Spring的问题也是多不胜数。所以对于Java开发人员学习Spring源码,理解Spring底层变得尤为重要。

本文就针对学习Spring源码的第一步: windows下编译Spring4.3.12源码,导入Idea。

搭建环境

Spring源码使用的是Gradle 进行构建的,所以需要下载 Gradle 以及搭建 java开发环境

Java环境使用的是 JDK1.8
JDK版本.png

Gradle版本5.2.1 Gradle下载
Gradle版本

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

下载Spring源码

Spring源码下载
Spring源码.png
下载zip文件到本地后解压。

开始编译

Spring官方给出的步骤

  1. 进入Spring源码目录cd spring-framework-4.3.21.RELEASE
  2. 编译spring-oxm 使用命令 gradlew :spring-oxm:compileTestJava (这一步执行了6分钟)
    构建spring-oxm.png
  3. 执行 gradlew idea -x test 编译整个spring-framework 为idea项目 (-x test是 不进行测试代码的编译, 我在执行这一步时就忘记了, 导致后面test大量出错, 完全跑不起来)

这一步会下载许多的依赖, 执行了快30分钟
构建idea项目.png
如果是eclipse项目 :编译为eclipse项目 , 不过个人建议还是使用idea。会少些折腾。

导入idea

编译完成之后在根目录下会有一个 spring.ipr 文件
spring-ipr-file.png
使用idea打开这个文件就可以将所有 module 导入idea 当中.

文件夹上有个 蓝色的标记 表明已经导入完成。(如图)
导入idea完成.png

这一步我并没有碰到网上说的一些其他的一些毛病. 还算比较顺利

测试

编译完成了, 接下来就是如和使用我们自己编译的spring程序,使我们在debug时直接到代码内部当中。

首先建一个测试的module, 我这里创建了一个maven module (对gradle不是很熟悉)
创建测试module.png
然后在 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的依赖
添加spring依赖.png

这里+展开后需要选择 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 当中 在其中加入一条输出语句.
build-success-test.png
执行结果 :
执行结果

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

参考文章

等一杯咖啡

from_lazy_boy

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值