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

简介: 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


相关文章
|
11月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `<appender>` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `<logger>` 和 `<root>` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
2746 1
|
11月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1102 29
|
11月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
467 4
|
11月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
11月前
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
前端开发 Java 数据库连接
【springcloud合集】03:IDEA新建父工程project
【springcloud合集】03:IDEA新建父工程project
514 0
【springcloud合集】03:IDEA新建父工程project
|
7月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1186 0
|
8月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
960 0
|
4月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
475 3
|
4月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
1002 2

推荐镜像

更多
  • DNS