Spring源码调试环境搭建

1. Spring源代码下载地址:
        https://github.com/spring-projects/spring-framework, 本文所用版本5.2.x

2. 安装Gradle:

        Spring依靠Gradle构建工具管理项目包依赖.

(1)Gradle下载地址: https://services.gradle.org/distributions/https://gradle.org/releases/

(2)配置环境变量

        变量名:GRADLE_USER_HOME(变量名要与gradle-wrapper.properties中的信息一致)

        变量值:C:\Users\gradle-6.8.3-bin\7ykxq50lst7lb7wx1nijpicxn\gradle-6.8.3(文件解压路径)

        系统变量path: %GRADLE_USER_HOME%\bin

        测试配置成功:打开cmd,输入gradle -v

安装中遇到的问题(一):

        注意:需要下载的gradle版本,这个需要和jdk及gradle插件的版本对应起来

        之前编译5.2.x版本的源码,遇到错误,原因是编译spring对gradle的版本是有要求的,我们先看看spring 5.2.x源代码中build.gradle的信息:

        JMH(jmh-gradle-plugin)的版本是0.6.4, 而JMH跟gradle是有对应关系的,JMH 0.6.4对应的gradle版本是6.8+。官网查看:https://github.com/melix/jmh-gradle-plugin 

 如果Gradle版本不对,会报各种各样的错误,例如:

        1)Only Project build scripts can contain plugins {} blocks

        2)This version of the JMH Gradle plugin requires Gradle 6+, .........

(3)配置gradle工程属性        

          Idea 依次点击file----setting----Build,Execution,Deployment菜单

        在D:\Program Files新建.gradle文件夹(根据自己情况选择),做为gradle下载的jar包仓库主目录,默认在C:\Users\Administrator\.gradle.
 

(4)搭建Springboot项目       

        1)Idea中创建springboot项目,并使用Gradle来管理包依赖,file----new project

        2)点击next,Type类型选择Gradle project

        3)点击next,在最左侧的大类中点击需要添加的依赖,中间窗口进行选择,选择的依赖显示在最右边的窗口

         4)点击next,填入项目名称和路径

         5)点击finish,完成项目创建,项目目录结构如图所示。

        6)注意很重要的一步:点击finish进入项目后会下载依赖包,用默认的国外maven源非常慢,建议使用阿里的国内镜像源进行下载,编辑build.gradle配置文件,大概291行

repositories {
			maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
			maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }
			mavenCentral()
			maven { url "https://repo.spring.io/libs-spring-framework-build" }
		}

3. Java 版本:
官方文档中要求JDK8 262或者以后的版本都行。但是我的JDK版本是201,JRE版本是281,总是出现一些莫名其妙的错误,所以统统将其改为更高版本的291试试。

4.  编译Spring源码框架

        在Spring下载官网中选择5.2.x版本克隆url:

         打开idea,输入url源码地址和项目主目录,点击finish,进入自动创建项目进程:

 5. 编译源码遇到的问题

        (1)cglib和objenesis的编译错误,Spring把最新的cglib和objenesis给重新打包了,需要重新引入

        点击cglibRepackerJar和objenesisRepackerJar,执行任务重新引入两个包

        (2)A build scan was not published as you have not authenticated with server 'ge.spring.io'错误。这个注释掉 setting.gradle 中的 ge.spring.io 就好了

6. 编译结束,创建自己的项目使用源码 

         (1)创建自己的模块

 

         (2)创建好模块之后,我们要在gradle文件中,加入对spring的依赖

        (3)之后便开始进行自己项目的构建:在项目中引入spring的类 

 7. 创建测试模块:
        (1)每个模块中提供了Junit测试代码,可以直接使用,也可以添加或者修改。
        (2)自己创建测试模块:
        (3)在spring项目中创建一个子模块的文件夹,例如bruce-test
        (4)在文件夹中添加build.gradle文件, 可以将其名字改成与模块名字一致,bruce-test.gradle
        (5)在spring项目中的settings.gradle中引入子模块,例如在文件中添加 include "bruce-test"
        (6)在spring项目上右键gradle-->refresh
        (7)然后创建src.main.java,src.main.resources, src.test.java等文件夹
        (8)创建包名,添加class文件。

         1)Gradle依赖配置bruce-test.gradle:

                参考spring-test模块的spring-test.gradle文件。本文目前只测试spring context,即spring 容器相关的功能,所以只配置optional(project(":spring-context")) 即可。

description = "Spring TestContext Framework" 
dependencies {
    compile(project(":spring-core"))
    optional(project(":spring-aop"))
    optional(project(":spring-beans"))
    optional(project(":spring-context"))
    optional(project(":spring-jdbc"))
    optional(project(":spring-orm"))
    optional(project(":spring-tx"))
    optional(project(":spring-web"))
    optional(project(":spring-webflux"))
    optional(project(":spring-webmvc"))
    optional(project(":spring-websocket"))

        2)Student.java:

package com.bruce;
 
public class Student {
    private int age;
    private String name;
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}

        3)ClassRoom.java:

package com.bruce;
 
public class ClassRoom {
    private Student student;
     
    public Student getStudent() {
        return student;
    }
 
    public void setStudent(Student student) {
        this.student = student;
    }
}

        4)spring容器(上下文)配置文件:

<?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 https://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
 
    <bean id="classroom" class="com.bruce.ClassRoom">
        <property name="student" ref="student"/>
    </bean>
 
    <bean id="student" class="com.bruce.Student"></bean>
</beans>

        5)具体测试类 StudentDemoTest.java:

        两种方式:

        使用main方法测试:

package com.bruce;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class StudentDemoTest {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ApplicationContext ac = new ClassPathXmlApplicationContext("com/bruce/spring-bruce-test.xml");
        Student student = (Student) ac.getBean("student");
        student.setAge(12);
        student.setName("bruce");
        ClassRoom classroom = (ClassRoom) ac.getBean("classroom");
        System.out.println(classroom);
        System.out.println("Debug:学生年龄" + classroom.getStudent().getAge());
        System.out.println("Debug:学生姓名" + classroom.getStudent().getName());
    }
 
}

        使用Junit:

package com.bruce;
 
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class StudentJunitTest {
    @Test
    public void contextTest() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring-bruce-test.xml");
        Student student = (Student) ac.getBean("student");
        student.setAge(12);
        student.setName("bruce");
        ClassRoom classroom = (ClassRoom) ac.getBean("classroom");
        System.out.println(classroom);
        System.out.println("Debug:学生年龄" + classroom.getStudent().getAge());
        System.out.println("Debug:学生姓名" + classroom.getStudent().getName());
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值