源码下载 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
命令:
1
2
cd spring-5.3.10-analyse/
./gradlew :spring-oxm:compileTestJava
出现如下的 BUILD SUCCESSFUL
后,用 Intellij-Idea
打开项目即可:
1
2
3
4
5
6
7
8
9
10
11
12
> Task :spring-oxm:xjcGenerate
Errors 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🛠jar must specify an absolute path but is ${ tools .jar} in com.sun.xml.bind:jaxb-xjc:2.2.11
Errors 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🛠jar must specify an absolute path but is ${ tools .jar} in com.sun.xml.bind:jaxb-core:2.2.11
Errors 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🛠jar must specify an absolute path but is ${ tools .jar} in com.sun.xml.bind:jaxb-impl:2.2.11
BUILD SUCCESSFUL in 1m 37s
47 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
,然后添加所需依赖:
1
2
3
4
5
6
7
8
9
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
源代码能否实现依赖注入。
创建测试类,对应的代码:
1
2
3
4
5
6
7
8
9
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 {
}
1
2
3
4
5
6
7
8
9
10
package org.springframework.vitahlin.hello;
import org.springframework.stereotype.Service;
@Service
public class HelloWorldService {
public void sayHello () {
System. out . println ( "Hello world" );
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
函数,结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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@c540f5a
Hello 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 12s
38 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
,如图所示:image.png
再次执行结果如下:image.png
执行正常,接下来就可以调试spring源代码了。
参考