Spring 6 源码编译和高效阅读源码技巧分享

简介: Spring 6 源码编译和高效阅读源码技巧分享

六. 测试案例

在完成上文 Spring 源码编译之后,Congratulations ! 接下来新增一个示例模块来依赖工程中的其它 spring 模块做个简单的测试。


1. 新增模块

File → Module 新增 spring-sample 示例模块

微信图片_20230710092120.png



2. 添加依赖

在 spring-sample 模块下的 build.gradle 新增 spring-context 依赖,它是包含了 spring-core、 spring-bean 和 IoC容器等Spring 运行时上下文的依赖。


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

1

微信图片_20230710092131.png


3. 测试代码

代码结构


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJlv6qAe-1670807292651)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0619225e2eaa4e599fb00f3ab498cba3~tplv-k3u1fbpfcp-zoom-1.image)]


/**

* 人接口

*/

public interface IPersonService {

/**

 * 说

 */

void speak();

}

/**

* 中国人

*/

@Service

@Primary

public class ChineseService implements IPersonService {

@Override

public void speak() {

 System.out.println("我会说中文");

}

}


/**

* 美国人

*/

@Service

public class AmericanService implements IPersonService {

@Override

public void speak() {

 System.out.println("I can speak English");

}

}

/**

* 启动测试类

*/

@ComponentScan("com.youlai.spring.sample.**")

public class SpringSampleApplication {

public static void main(String[] args) {

 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(

   SpringSampleApplication.class

 );

 IPersonService personService = context.getBean(IPersonService.class);

 personService.speak();

}

}


4. 测试结果

微信图片_20230710092145.png


image-20221210232239371


七. 源码阅读

本章节就基于编译好的 Spring 源码环境进行源码调试,为了方便下面就基于上章节的测试案例来对 getBean 源码流程分析,后续会更新出 Spring 源码阅读系列文章。


1. getBean 源码

快速定位: 通过 Debug (F7)可以很清晰看到详细的调用栈

微信图片_20230710092159.png


image-20221210230131704


加深理解记忆: 基于调用栈绘制时序图(IDEA的PlantUML插件)


时序图源文件:https://gitee.com/youlaiorg/spring-framework/blob/master/doc/diagram/getBean.puml

微信图片_20230710092210.png



getBean时序图


深入概念原理


时序图反映了在getBean()调用链中 DefaultListableBeanFactory 承担着核心角色,甚至可以说是 Spring 最核心的一个 BeanFacory 实现 ,也被称为 Spring 的 “发动机”,所以其重要性是学习 Spring 源码的必修课。


DefaultListableBeanFactory : 可枚举的Bean工厂。

微信图片_20230710092221.png



通过类注释我们可以了解到:DefaultListableBeanFactory 是一个成熟的bean工厂;包含了 bean 定义元数据(beanDefinitionMap),提供了Bean定义的注册和获取方法;管理已存在的Bean实例,而不是基于Bean定义去创建新实例。


2. todo

后续更新 Spring 6 源码阅读系列 @有来技术。


八. 问题整理

在编译过程中,因环境不同每个人可能遇到的问题也都不同,但是总结出来的都是没按照官方文档要求或者自己粗心所致,下面就总结编译中遇到常见的问题,也希望大家在留言区把自己遇到问题记录下。


1. 问题一

报错详情


D:\SourceCode\spring-framework>gradlew :spring-oxm:compileTestJava

> Task :buildSrc:compileJava FAILED

D:\SourceCode\spring-framework\buildSrc\src\main\java\org\springframework\build\KotlinConventions.java:44: 错误: 找不到符号

               freeCompilerArgs.addAll(List.of("-Xsuppress-version-warnings", "-Xjsr305=strict", "-opt-in=kotlin.RequiresOptIn"));

                                           ^

 符号:   方法 of(java.lang.String,java.lang.String,java.lang.String)

 位置: 接口 java.util.List

1 个错误

FAILURE: Build failed with an exception.


解决方案


gradlew :spring-oxm:compileTestJava info 查看使用 JDK 的版本是不是17,如果不是请在配置文件 gradle.properties 添加:


org.gradle.java.home=D:\Java\jdk-17.0.3.1

1

2. todo

欢迎大家留言区补充或提问~


九. 结语

本篇从 Spring 6 编译依赖的基础环境搭建(JDK17和Gradle)开始、根据官方文档编译源码、在工程新增示例模块测试、以及最后通过对getBean的源码调试,绘制时序图和类注释辅助手段来掌握高效阅读Spring源码技巧。还有一点需要提醒,一定要带着一个明确的目的去看源码,不要被动式的为了学习而学习,不然很容易在知识的海洋里呛水。最后预祝大家编译成功,掌握到属于自己高效阅读源码的方式。


持续更新~


附. 源码

Spring 6 编译源码仓库地址: https://gitee.com/youlaiorg/spring-framework


相关文章
|
16天前
|
小程序 JavaScript Java
高校宿舍信息|基于Spring Boot的高校宿舍信息管理系统的设计与实现(源码+数据库+文档)
高校宿舍信息|基于Spring Boot的高校宿舍信息管理系统的设计与实现(源码+数据库+文档)
22 0
|
22天前
|
监控 Java 应用服务中间件
Spring Boot 源码面试知识点
【5月更文挑战第12天】Spring Boot 是一个强大且广泛使用的框架,旨在简化 Spring 应用程序的开发过程。深入了解 Spring Boot 的源码,有助于开发者更好地使用和定制这个框架。以下是一些关键的知识点:
37 6
|
22天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
44 3
|
3天前
|
Java Spring
【JavaEE进阶】 Spring AOP源码简单剖析
【JavaEE进阶】 Spring AOP源码简单剖析
|
16天前
|
小程序 JavaScript Java
小程序商城|基于Spring Boot的智能小程序商城的设计与实现(源码+数据库+文档)
小程序商城|基于Spring Boot的智能小程序商城的设计与实现(源码+数据库+文档)
24 0
小程序商城|基于Spring Boot的智能小程序商城的设计与实现(源码+数据库+文档)
|
16天前
|
安全 JavaScript Java
在线问卷调查|基于Spring Boot的在线问卷调查系统的设计与实现(源码+数据库+文档)
在线问卷调查|基于Spring Boot的在线问卷调查系统的设计与实现(源码+数据库+文档)
27 0
|
22天前
|
存储 前端开发 Java
Spring Boot自动装配的源码学习
【4月更文挑战第8天】Spring Boot自动装配是其核心机制之一,其设计目标是在应用程序启动时,自动配置所需的各种组件,使得应用程序的开发和部署变得更加简单和高效。下面是关于Spring Boot自动装配的源码学习知识点及实战。
18 1
|
22天前
|
XML Java uml
spring 源码解析——第一篇(ioc xml方式)
spring 源码解析——第一篇(ioc xml方式)
35 0
|
22天前
|
安全 Java 应用服务中间件
阿里技术官架构使用总结:Spring+MyBatis源码+Tomcat架构解析等
分享Java技术文以及学习经验也有一段时间了,实际上作为程序员,我们都清楚学习的重要性,毕竟时代在发展,互联网之下,稍有一些落后可能就会被淘汰掉,因此我们需要不断去审视自己,通过学习来让自己得到相应的提升。
|
8月前
|
Java 应用服务中间件 Spring
66Spring - 源码解析Spring的启动机制(contextConfigLocation)
66Spring - 源码解析Spring的启动机制(contextConfigLocation)
46 0