编译Spring5.3.10源码

记录如何下载并重命名 Spring 5.3.10 源码、使用 Gradle 编译并在 IntelliJ IDEA 中创建测试模块,验证注解扫描与依赖注入可正常运行,并给出 Gradle 构建日志与注意事项。

7 分钟1.1k 字

编译Spring5.3.10源码开发与工程 · 7 分钟

#源码下载

Github源码地址:https://github.com/spring-projects/spring-framework/tree/v5.3.10下载后将目录 spring-framework-5.3.10 重命名为 spring-5.3.10-analyse。

注意gitignore中不能忽略 spring-aop 目录下的 target 目录。

#编译

跳转到源代码目录,执行 gradle 命令:

shellshell折叠展开
cd spring-5.3.10-analyse/./gradlew :spring-oxm:compileTestJava

出现如下的 BUILD SUCCESSFUL 后,用 Intellij-Idea 打开项目即可:

shellshell折叠展开
> Task :spring-oxm:xjcGenerateErrors occurred while build effective model from /Users/vitah/.gradle/caches/modules-2/files-2.1/com.sun.xml.bind/jaxb-xjc/2.2.11/4da3d39ae8ccc39549e3f8971f56035f61d7bf79/jaxb-xjc-2.2.11.pom:    'dependencyManagement.dependencies.dependency.systemPath' for com.sun:tools:jar must specify an absolute path but is ${tools.jar} in com.sun.xml.bind:jaxb-xjc:2.2.11Errors occurred while build effective model from /Users/vitah/.gradle/caches/modules-2/files-2.1/com.sun.xml.bind/jaxb-core/2.2.11/db0f76866c6b1e50084e03ee8cf9ce6b19becdb3/jaxb-core-2.2.11.pom:    'dependencyManagement.dependencies.dependency.systemPath' for com.sun:tools:jar must specify an absolute path but is ${tools.jar} in com.sun.xml.bind:jaxb-core:2.2.11Errors occurred while build effective model from /Users/vitah/.gradle/caches/modules-2/files-2.1/com.sun.xml.bind/jaxb-impl/2.2.11/2d4b554997fd01d1a2233b1529b22fc9ecc0cf5c/jaxb-impl-2.2.11.pom:    'dependencyManagement.dependencies.dependency.systemPath' for com.sun:tools:jar must specify an absolute path but is ${tools.jar} in com.sun.xml.bind:jaxb-impl:2.2.11 BUILD SUCCESSFUL in 1m 37s47 actionable tasks: 47 executed A build scan was not published as you have not authenticated with server 'ge.spring.io'.

#新建测试模块

Intellij-Idea -> New -> Module ,新建测试模块 spring-vitahlin,然后添加所需依赖:

javajava折叠展开
dependencies {    api(project(":spring-beans"))    api(project(":spring-core"))    api(project(":spring-aop"))    api(project(":spring-context"))    api(project(":spring-instrument"))    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'}

模块创建完成后,我们还需要创建测试类来验证导入的 spring 源代码能否实现依赖注入。

创建测试类,对应的代码:

javajava折叠展开
package org.springframework.vitahlin.hello; import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration; @Configuration@ComponentScan(basePackages = "org.springframework.vitahlin.hello")public class HelloWorldScanConfig {}
javajava折叠展开
package org.springframework.vitahlin.hello; import org.springframework.stereotype.Service; @Servicepublic class HelloWorldService {    public void sayHello() {        System.out.println("Hello world");    }}
javajava折叠展开
package org.springframework.vitahlin.hello; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * Bean扫描示例 */public class HelloWorldTest {    public static void main(String[] args) {        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(HelloWorldScanConfig.class);        HelloWorldService userService = (HelloWorldService) context.getBean("helloWorldService");        System.out.println(userService);        userService.sayHello();    }}

执行 main 函数,结果如下:

shellshell折叠展开
15:44:23: Executing ':spring-vitahlin:HelloWorldTest.main()'... Starting Gradle Daemon...Gradle Daemon started in 495 ms> Task :buildSrc:compileJava UP-TO-DATE> Task :buildSrc:compileGroovy NO-SOURCE> Task :buildSrc:pluginDescriptors UP-TO-DATE> Task :buildSrc:processResources UP-TO-DATE> Task :buildSrc:classes UP-TO-DATE> Task :buildSrc:jar UP-TO-DATE> Task :buildSrc:assemble UP-TO-DATE> Task :buildSrc:pluginUnderTestMetadata UP-TO-DATE> Task :buildSrc:compileTestJava NO-SOURCE> Task :buildSrc:compileTestGroovy NO-SOURCE> Task :buildSrc:processTestResources NO-SOURCE> Task :buildSrc:testClasses UP-TO-DATE> Task :buildSrc:test NO-SOURCE> Task :buildSrc:validatePlugins UP-TO-DATE> Task :buildSrc:check UP-TO-DATE> Task :buildSrc:build UP-TO-DATE> Task :spring-vitahlin:processResources NO-SOURCE> Task :spring-expression:processResources UP-TO-DATE> Task :spring-aop:processResources UP-TO-DATE> Task :spring-core:cglibRepackJar UP-TO-DATE> Task :spring-beans:processResources UP-TO-DATE> Task :spring-core:objenesisRepackJar UP-TO-DATE> Task :spring-context:processResources UP-TO-DATE> Task :spring-core:processResources UP-TO-DATE> Task :spring-instrument:compileJava UP-TO-DATE> Task :spring-instrument:processResources NO-SOURCE> Task :spring-instrument:classes UP-TO-DATE> Task :spring-instrument:jar UP-TO-DATE> Task :spring-jcl:compileJava UP-TO-DATE> Task :spring-jcl:processResources UP-TO-DATE> Task :spring-jcl:classes UP-TO-DATE> Task :spring-jcl:jar UP-TO-DATE> Task :spring-core:compileKotlin UP-TO-DATE> Task :spring-core:compileJava UP-TO-DATE> Task :spring-core:classes UP-TO-DATE> Task :spring-core:inspectClassesForKotlinIC UP-TO-DATE> Task :spring-core:jar UP-TO-DATE> Task :spring-expression:compileKotlin UP-TO-DATE> Task :spring-expression:compileJava UP-TO-DATE> Task :spring-expression:classes UP-TO-DATE> Task :spring-expression:inspectClassesForKotlinIC UP-TO-DATE> Task :spring-expression:jar UP-TO-DATE> Task :spring-beans:compileGroovy UP-TO-DATE> Task :spring-beans:compileKotlin UP-TO-DATE> Task :spring-beans:compileJava NO-SOURCE> Task :spring-beans:classes UP-TO-DATE> Task :spring-beans:inspectClassesForKotlinIC UP-TO-DATE> Task :spring-beans:jar UP-TO-DATE> Task :spring-aop:compileJava UP-TO-DATE> Task :spring-aop:classes UP-TO-DATE> Task :spring-aop:jar UP-TO-DATE> Task :spring-context:compileKotlin> Task :spring-context:compileJava> Task :spring-context:compileGroovy NO-SOURCE> Task :spring-context:classes> Task :spring-context:inspectClassesForKotlinIC> Task :spring-context:jar> Task :spring-vitahlin:compileJava> Task :spring-vitahlin:classes > Task :spring-vitahlin:HelloWorldTest.main()org.springframework.vitahlin.hello.HelloWorldService@c540f5aHello world Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. See <https://docs.gradle.org/7.2/userguide/command_line_interface.html#sec:command_line_warnings> BUILD SUCCESSFUL in 12s38 actionable tasks: 6 executed, 32 up-to-date A build scan was not published as you have not authenticated with server 'ge.spring.io'.15:44:36: Execution finished ':spring-vitahlin:HelloWorldTest.main()'.

成功打印地址和输出内容,依赖注入验证成功,但是 gradle 每次都会执行 Task 内容。需要修改 Gradle 的配置,指定 Gradle 为 Intellij IDEA,接下来就可以调试 Spring 源代码了。

#参考

END · 2026.02.04
Spring AOP源码之基本概念介绍开发与工程 · 18 分钟
上一篇 · 更早

Spring AOP源码之基本概念介绍

2026.02.04 · 18 分钟
你可能也想读
Spring AOP源码之基本概念介绍2026.02.04 · 18 分钟↗Spring AOP源码之ProxyFactory源码解析2026.02.04 · 27 分钟↗Spring核心概念介绍2026.02.04 · 14 分钟↗
林
VitahLin

后端工程师 · 写长文
VitahLin 的个人博客,记录经济观察、股票研究,以及后端开发、分布式系统、数据库与 Redis 的原理和工程实践。