Spring深度源码学习(一) 源码环境搭建

2022-01-05 14:42:07 浏览数 (1)

Spring 源码环境搭建

一. 背景

今天从公司图书角借到一本书, 名字叫 <<Spring源码深度解析>>, 抱着试着看的态度学习了下, 结果发现在使用idea搭建Spring源码环境时会出现很多问题, 而我的性格有时候又比执着. 所以还是花了将近一天时间把环境搭建好了. 现在将搭建过程重新梳理下, 希望能够帮助到其他人

二. 开发环境

  • jdk: 1.8.0_231
  • gradle 4.9
  • IDEA 2021.1.2
  • spring 5.0.x
  1. 关于jdk, gradle, idea 可自行下载
  2. gradle 是一种类似maven的编译构建工具, 如果不会使用, 可以跳转至 这里 学习一下. 但建议版本最好一致. 否则可能会出错.
  3. 关于Spring源码下载安装, 下面会着重介绍

三. 源码下载与构建

下载

  1. 选择对应版本, 点击 这里 进行下载. 也可以直接在右上角code按钮, 复制下载地址, 执行下一步操作
  1. 通过idea导入, 复制第1步的下载地址导入 随便在一个页面, 双击 ctrl上面的 shift, 然后输入 get from ,选择第一个
  1. 输入第1步的git地址, 下载Spring源码
  1. 下载完毕后, 确认是否是5.0.x版本, 如果不是请切到这一版本 不知道为什么, 在第一步选择好版本之后下载的代码还是main分支上的, 所以这一步很重要

下载完毕后, 先不要急着构建, 需要我们先进行配置, 心急吃不了热豆腐~~~

配置

进入gradle->wrapper->gradle-wrapper.properties文件,将gradle改成本地distributionUrl=file:///E:/Download/maven_rep/gradle-4.9-bin.zip

注意路径不要有空格, 否则会报错

在根目录的build.gradle文件里(相当于maven的pom文件)找到150行左右的位置,将原来的repositories修改成如下配置:

代码语言:javascript复制
	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" }
		maven { url "https://repo.spring.io/milestone" }
		maven { url "https://repo.spring.io/plugins-release" }
	}

继续修改 build.gradle 文件, 将 100行左右的-Werror参数去除

如果不去除, 会在后面编译的时候发现警告后,将警告当成了错误来处理, 影响程序正常运行

在spring-beans模块下的spring-beans.gradle里,注释下面代码, 否则会报No such property: values for class: org.gradle.api.internal.tasks.DefaultTaskDependencies错误

构建

完成上述工作之后,点击右上角刷新gradle的图标,开始重新构建(时间用时较长20min )

点开org.springframework.context.ApplicationContext类,按下Ctrl Alt U键,如果出现下图所示类图界面说明构建成功,构建过程就是找依赖对象的过程

编译

首先编译spring-oxm模块

点击右上角gradle打开编译视图,找到springoxm模块,然后在Task -> other下双击compileTestjava

编译之后会报错, 大致内容如下

代码语言:javascript复制
Circular dependency between the following tasks:
:spring-beans:compileGroovy
--- :spring-beans:compileJava
     --- :spring-beans:compileKotlin
          --- :spring-beans:compileGroovy (*)

这里我们需要再次修改一下spring-beans模块下的spring-beans.gradle文件(覆盖掉配置第4步注释的内容)

代码语言:javascript复制
def deps = compileGroovy.taskDependencies.immutableValues   compileGroovy.taskDependencies.mutableValues
compileGroovy.dependsOn = deps - "compileJava"
compileKotlin.dependsOn(compileGroovy)
compileKotlin.classpath  = files(compileGroovy.destinationDir)

再次进行编译 compileTestjava

然后编译 spring-core模块, 按照步骤1 即可, 无需步骤2

编译整个项

四. 源码测试

新建gradle模块, 用于编写测试代码

新模块结构如下, 下面贴出相关代码

代码语言:javascript复制
@Data
@ToString
@AllArgsConstructor
public class User {

	private Integer id;

	private String username;

}
----------------------------------------
@Configuration
@ComponentScan
public class BeanConfig {

	@Bean
	public User user(){
		return new User(1,"hello,spring");
	}

}
----------------------------------------
public class Main {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new
				AnnotationConfigApplicationContext(BeanConfig.class);
		User user = (User)context.getBean("user");
		System.out.println(user.toString());

	}

}

运行main方法, 控制台输出如下

控制台乱码问题的解决

从上图可以看到, 控制台显示的中文信息全部以乱码的形式出现, 这是因为

  1. 项目中gradle.properties文件中添加设置 org.gradle.jvmargs=-Dfile.encoding=UTF-8
  2. idea中在 Help -> Edit custom VM options添加设置 -Dfile.encoding=UTF-8
  3. 重启idea

附: 成功之后的控制台输出中文截图

参考博客 https://blog.csdn.net/qq_22172133/article/details/81513955 https://blog.csdn.net/foxException/article/details/108334235

0 人点赞