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());
}
}