Spring源码解析 | 第一篇 :IntelliJ IDEA编译Spring5.3.x源码

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Spring源码解析 | 第一篇 :IntelliJ IDEA编译Spring5.3.x源码

前言

工欲善其事必先利其器。学习和深读Spring源码一个重要的前提:编译源码到我们的本地环境。这样方便我们在本地环境添加注释、断点追踪、查看类或接口的继承关系等等,更加高效的学习Spring源码。个人觉得深读Spring源码对我们的编码水平会有很大很大的提升,因为其牵涉的广度、深读、以及优秀编码规范都值得我们去品、细品、慢慢品。废话不多说,本篇就如何在我们的intelliJ IDEA编译Spring源码的步骤以及在编译的过程中遇到的问题做一个详细说明。


环境

开发工具: IntelliJ IDEA 2019.3.3

编译工具: gradle-6.4-rc-4

操作系统: windows 10

Spring版本:Spring5.3.0

编译

一、下载Spring源码

访问Spring官方源码地址 https://github.com/spring-projects/spring-framework.git,下载源码zip包到本地


二、下载和配置编译工具Gradle

1. 下载Gradle


访问Gradle官网 https://services.gradle.org/distributions/,选择gradle-6.4-rc-4-bin.zip(截止2020-05-03当前最新),下载到本地并解压

微信图片_20230709205656.png微信图片_20230709205704.png

2. 配置Gradle系统环境变量

微信图片_20230709205745.png

微信图片_20230709205750.png



3. 验证Gradle

微信图片_20230709205752.png


三、IntelliJ IDEA编译Spring源码

1. 导入Spring源码至IntelliJ IDEA


将之前下载好的Spring源码解压后导入到IDEA,依次点击File->New->Project from Existing Sources,选择源码包路径下的build.gradle文件完成源码导入

微信图片_20230709205818.png微信图片_20230709205822.png


2. IntelliJ IDEA配置Gradle


依次打开File->Settings

微信图片_20230709205840.png


3. 开始编译


在编译开始之前,我们先看看下载的官方源码里给出的导入IDEA的提示

![在这里插入图片描述](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pLmxvbGkubmV0LzIwMjAvMDUvMDMvMW81RFJ0dnhCemVjZnlYLnBuZw?x-oss-process=image/format,png按照上面描述,因为上面导入我是按照第二步去做的。最后仅仅只需做第1条,预编译spring-oxm。进入项目路径,执行以下命令完成spring-oxm的预编译即可


gradlew :spring-oxm:compileTestJava

1

微信图片_20230709205902.png


完成了spring-oxm的预编译之后,就可以编译我们的代码了,一般由IDEA自动帮我们完成源码到projects的转换,也可以由我们手动import。

微信图片_20230709205905.png


自此,编译的整个过程已经完成。下面我们要做的事就是添加自己的模块对已编译的项目模块进行验证测试,相信我验证会是一个有趣的过程。


测试

打开源码我们可以看到每个模块都对应的有单元测试,再相比较平时自己在开发时干的事情。再想到流行的敏捷开发模式中的TDD(测试驱动开发),没有测试就没有功能代码。不禁觉得其中的优秀是为了让我忘尘而叹。

微信图片_20230709205924.png



扯回正题,不能让你们觉得我扯废话凑字数暴露没啥水平的真实情况。上面说到各个模块的单元测试我们可以测试编译项目是否有问题,但是后续学习在于模块之间的整合之上。所以我在此添加一个新的模块,这个模块模拟一个bean的创建和获取这么个过程。


1. 创建模块spring-demo


依次右击项目->New->Module

微信图片_20230709205929.png微信图片_20230709205931.png


2. 添加测试模块代码


先预览下添加的代码结构吧,很简单是不?加上需要添加依赖的build.gradle共5个文件。

微信图片_20230709205957.png

我这里贴出这5个文件的代码



@Configuration

@ComponentScan("com.fly4j.spring.context.**")

public class ContextConfig {

}

1

2

3

4

public interface IUserService {

}

1

2

@Service

@Scope("singleton")

public class UserServiceImpl implements IUserService {

public UserServiceImpl() {

 System.out.println(this.getClass().getSimpleName() + " 构造函数执行...");

}

}

1

2

3

4

5

6

7

public class ContextApplication {

public static void main(String[] args) {

 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(

   ContextConfig.class

 );

    IUserService bean = context.getBean(IUserService.class);

 System.out.println(bean);

}

}

1

2

3

4

5

6

7

8

9

// build.gradle

dependencies {

   testCompile group: 'junit', name: 'junit', version: '4.12'

   compile(project(":spring-context"))

   compile(project(":spring-instrument"))

}

1

2

3

4

5

6

相信以上代码机智的你一看就明白其意,其中build.gradle就只添加了spring-context和spring-instrument的依赖,spring-context模块里包含了bean工厂,可想而知,我这里生成bean和取出bean的测试案例是多么的依赖这个模块,另一个spring-instrument是spring-context模块编译需要的。


3. 测试


运行ContextApplication的main方法,其中会提示找不到CoroutinesUtils符号,这个问题解决我在下面一节的“问题一”进行了说明,我这里先放结果好了。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-74slidVQ-1588949769544)(https://i.loli.net/2020/05/03/A3qyDnE4CKIxd17.png)]


如上可以看到从上下文注入bean和取出bean的过程,至此spring-context这个重要模块验证成功结束。


问题

1. 问题一


Error:(350, 51) java: 找不到符号

 符号:   变量 CoroutinesUtils

 位置: 类 org.springframework.core.ReactiveAdapterRegistry.CoroutinesRegistrar

1

2

3

解决: 依次File->Project Structure->Libraries->±>java->spring-core->kotlin-coroutines->build->libs->kotlin-coroutines-5.3.0-SNAPSHOT.jar

微信图片_20230709210053.png微信图片_20230709210057.png微信图片_20230709210100.png

2. 问题二


Error:(26, 38) java: 找不到符号

 符号:   类 InstrumentationSavingAgent

 位置: 程序包 org.springframework.instrument


解决: 因为spring-context对spring-instrument有依赖,在build.gradle添加对spring-instrument的依赖即可。


结语

至此,Spring源码如何在IntelliJ IDEA如何编译这篇文章就废话完毕了。写这篇文章目的我希望把它作为Spring系列的开始,没有环境的学习就像你想抬一个没有边角的桌子无处施力。如果大家在编译时有什么问题欢迎指出。也可以联系我(微信号:WxHXR2015),大家相互学习,在当前环境下自己也是一个担心有今天没明天的菜比技术人。最后贴出我编译好的spring源码的地址,欢迎star。

https://github.com/haoxianrui/spring-framework.git


相关文章
|
19天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
49 2
|
2月前
|
搜索推荐 Java Spring
Spring Filter深度解析
【10月更文挑战第21天】Spring Filter 是 Spring 框架中非常重要的一部分,它为请求处理提供了灵活的控制和扩展机制。通过合理配置和使用 Filter,可以实现各种个性化的功能,提升应用的安全性、可靠性和性能。还可以结合具体的代码示例和实际应用案例,进一步深入探讨 Spring Filter 的具体应用和优化技巧,使对它的理解更加全面和深入。
|
20天前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
|
1月前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
44 3
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
75 0
|
6月前
|
Java 编译器 Maven
使用intellij idea搭建SSM架构的maven项目 详细
使用intellij idea搭建SSM架构的maven项目 详细
100 4
|
5月前
|
IDE Oracle Java
day4:JDK、IntelliJ IDEA的安装和环境变量配置
【7月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
228 0
|
5月前
|
网络协议 安全 Linux
在IntelliJ IDEA中使用固定公网地址远程SSH连接服务器环境进行开发
在IntelliJ IDEA中使用固定公网地址远程SSH连接服务器环境进行开发
111 2
|
6月前
|
Linux 开发工具 Windows
在WSL2中安装IntelliJ IDEA开发工具
在WSL2中安装IntelliJ IDEA开发工具
616 2