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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 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


相关文章
|
9天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
33 2
|
25天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
27天前
|
搜索推荐 Java Spring
Spring Filter深度解析
【10月更文挑战第21天】Spring Filter 是 Spring 框架中非常重要的一部分,它为请求处理提供了灵活的控制和扩展机制。通过合理配置和使用 Filter,可以实现各种个性化的功能,提升应用的安全性、可靠性和性能。还可以结合具体的代码示例和实际应用案例,进一步深入探讨 Spring Filter 的具体应用和优化技巧,使对它的理解更加全面和深入。
|
15天前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
40 9
|
1月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
113 5
|
1月前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
1月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
70 0
IntelliJ IDEA - 复制文件全限定名快捷键
IntelliJ IDEA - 复制文件全限定名快捷键
952 0
IntelliJ IDEA - 复制文件全限定名快捷键
|
6月前
IntelliJ IDEA常用的快捷键
IntelliJ IDEA常用的快捷键
48 0

推荐镜像

更多
下一篇
无影云桌面