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


相关文章
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
709 70
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
535 2
|
9月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
1341 0
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
626 7
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
365 0
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
389 2
|
10月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1365 0
|
11月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
1218 0
|
前端开发 Java 数据库
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
540 0

热门文章

最新文章