Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit c10df9a

Browse files
1,初次增加SpringBoot的源码解析文章。
1 parent 0aa53aa commit c10df9a

8 files changed

+3267
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
## 1 前言
2+
这是SpringBoot2.1源码分析专题的第一篇文章,主要讲如何来搭建我们的源码阅读调试环境。如果有经验的小伙伴们可以略过此篇文章。
3+
## 2 环境安装要求
4+
* IntelliJ IDEA
5+
* JDK1.8
6+
* Maven3.5以上
7+
8+
## 3 从github上将SpringBoot源码项目下载下来
9+
首先提供**SpringBoot2.1.0**的github地址:
10+
https://github.com/spring-projects/spring-boot/tree/v2.1.0.RELEASE
11+
12+
因为要进行阅读源码和分析源码项目,我们是不是要在里面写一些注释帮助我们阅读理解源码,因此需要将SpringBoot源码项目fork到自己的github仓库中,然后再利用**git clone url**命令将已经fork到自己github仓库的SpringBoot源码拉取下来即可。
13+
但由于以上方式往往很慢,通常会超时,所以笔者直接将SpringBoot项目直接下载下来,然后再导入IDEA中。
14+
15+
![](https://user-gold-cdn.xitu.io/2020/2/23/1706fb164630bfac?w=1310&h=484&f=png&s=70931)
16+
## 4 将SpringBoot源码项目导入到IDEA中
17+
将刚才下载的spring-boot2.1.0.RELEASE项目选择maven方式导入到IDEA中,然后一直next即可导入完成,注意选择JDK版本是1.8,maven版本是3.5+。
18+
19+
![](https://user-gold-cdn.xitu.io/2020/2/23/1706fb50079899ac?w=734&h=266&f=png&s=12373)
20+
此时下载maven依赖是一个漫长的等待过程,建议maven没有配置(阿-里-云)仓库的小伙伴们配置一下,这样下载速度会快很多。参考[配置maven使用(阿-里-云)仓库](https://blog.csdn.net/zhuzj12345/article/details/93200211)进行配置即可。
21+
## 5 编译构建SpringBoot源码项目
22+
此时导入项目后,我们进行编译构建SpringBoot源码项目了,在构建之前做两个配置:
23+
1. 我们要禁用maven的代码检查,在根pom.xml中增加一下配置即可,如下图:
24+
> ![](https://user-gold-cdn.xitu.io/2020/2/23/1706fbc5725ffaf8?w=947&h=303&f=png&s=33333)
25+
2. 可能有的小伙伴们的pom.xml文件的project标签上显示`java.lang.OutOfMemoryError`错误,这是因为IDEA里的Maven的importer设置的JVM最大堆内存过小而导致的,如下图,此时可参考[Maven依赖包导入错误(IntelliJ IDEA)](https://blog.csdn.net/w605283073/article/details/85107497)解决即可。
26+
> ![](https://user-gold-cdn.xitu.io/2020/2/23/1706fc20d5eaba6b?w=688&h=254&f=png&s=98291)
27+
28+
进行了上面的两点配置后,此时我们就可以直接执行以下maven命令来编译构建源码项目了。
29+
```
30+
mvn clean install -DskipTests -Pfast
31+
```
32+
33+
![](https://user-gold-cdn.xitu.io/2020/2/23/1706fc5696712841?w=697&h=92&f=png&s=8216)
34+
此时又是漫长的等待,我这里等待5分钟左右就显示构建成功了,如下图:
35+
![](https://user-gold-cdn.xitu.io/2020/2/23/1706fdcd5edaceb9?w=890&h=563&f=png&s=56801)
36+
## 6 运行SpringBoot自带的sample
37+
因为SpringBoot源码中的spring-boot-samples模块自带了很多DEMO样例,我们可以利用其中的一个sample来测试运行刚刚构建的springboot源码项目即可。但此时发现spring-boot-samples模块是灰色的,如下图:
38+
![](https://user-gold-cdn.xitu.io/2020/2/23/1706fca29948aa2a?w=300&h=136&f=png&s=5880)
39+
这是因为spring-boot-samples模块没有被添加到根pom.xml中,此时将其添加到根pom.xml中即可,增加如下配置,如下图:
40+
![](https://user-gold-cdn.xitu.io/2020/2/23/1706fcb839241e47?w=815&h=330&f=png&s=34161)
41+
此时我们挑选spring-boot-samples模块下的spring-boot-sample-tomcat样例项目来测试好了,此时启动`SampleTomcatApplication``main`函数,启动成功界面如下:
42+
43+
![](https://user-gold-cdn.xitu.io/2020/2/23/1706fde9a5073f65?w=1843&h=444&f=png&s=130677)
44+
然后我们再在浏览器发送一个HTTP请求,此时可以看到服务端成功返回响应,说明此时SpringBoot源码环境就已经构建成功了,接下来我们就可以进行调试了,如下图:
45+
46+
![](https://user-gold-cdn.xitu.io/2020/2/23/1706fd98c2621c7b?w=411&h=161&f=png&s=9614)
47+
48+
## 7 动手实践环节
49+
前面已经成功构建了SpringBoot的源码阅读环境,小伙伴们记得自己动手搭建一套属于自己的SpringBoot源码调试环境哦,阅读源码动手调试很重要,嘿嘿。
50+
51+
**下节预告**:
52+
<font color=Blue>我们该如何去分析SpringBoot源码涉及模块及结构?--SpringBoot源码(二)</font>
53+
54+
55+
**原创不易,帮忙点个赞呗**!
56+
57+
---------------------------------------------------
58+
欢迎关注【源码笔记】公众号,一起学习交流。
59+
60+
![](https://user-gold-cdn.xitu.io/2020/3/15/170dd9bb2b5b59de?w=142&h=135&f=png&s=39743)
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
注:该源码分析对应SpringBoot版本为**2.1.0.RELEASE**
2+
## 1 前言
3+
本篇接
4+
[如何搭建自己的SpringBoot源码调试环境?--SpringBoot源码(一)](https://juejin.im/post/5e51d18af265da576b566273)
5+
6+
前面搭建好了自己本地的SpringBoot源码调试环境后,此时我们不要急着下手进入到具体的源码调试细节中,**刚开始阅读源码,此时我们一定要对项目结构等有一个整体的认识,然后再进行源码分析调试**。推荐阅读下笔者之前写的的[分析开源项目源码,我们该如何入手分析?](https://juejin.im/post/5e4d06b451882549670673c5)一文,干货满满哦。
7+
8+
## 2 SpringBoot源码模块一览
9+
我们先来对SpringBoot的源码模块来一个大致的了解,如下图:
10+
11+
![](https://user-gold-cdn.xitu.io/2020/2/23/1707109ab6ff4c1f?w=431&h=273&f=png&s=17190)
12+
从上图可以看到,主要有以下四个模块:
13+
* **spring-boot-project**:整个SpringBoot框架全部功能在这个模块实现,SpringBoot项目95%的代码都在这里实现,源码总共有25万行左右。
14+
* **Spring-boot-samples**:这个是SpringBoot给小伙伴们赠送的福利,里面包含了各种各样使用SpringBoot的简单demo,我们调试阅读源码的时候可以充分利用该模块。
15+
* **Spring-boot-sample-invoker**:这个模块应该是跟sample模块有关,注意根pom.xml中有这么一句话:`Samples are built via the invoker plugin`,该模块无代码。
16+
* **Spring-boot-tests**:这个模块SpringBoot的测试模块,跟部署测试和集成测试有关。
17+
18+
因为SpringBoot的全部功能在spring-boot-project模块实现,因此下面重点来介绍下 spring-boot-project 模块。
19+
## 3 spring-boot-project源码模块详解
20+
先来看下spring-boot-project整体模块结构,如下图,然后我们再逐个来介绍:
21+
22+
![](https://user-gold-cdn.xitu.io/2020/2/23/170711f4a6a14a10?w=300&h=347&f=png&s=13577)
23+
#### 1) spring-boot-parent
24+
这个模块没有代码,是spring-boot模块的父项目,被其他子模块继承。
25+
#### 2) spring-boot
26+
这个模块是SpringBoot项目的核心,可以说一些基础核心的功能都在这里实现,为SpringBoot的其他模块组件功能提供了支持,主要包括以下核心功能:
27+
* `SpringApplication`类,这个是SpringBoot的启动类,提供了一个静态的`run`方法来启动程序,该类主要用来创建并且刷新Spring容器`ApplicationContext`.
28+
* 支持选择不同的容器比如Tomcat,Jetty等来作为应用的嵌入容器,这个是SpringBoot的新特性之一。
29+
* 外部配置支持,这个指的是我们执行`java -jar xxx.jar`命令时可以带一些参数,比如执行`java -jar demo.jar --server.port=8888`来将应用端口修改为8888.
30+
* 该模块内置了一些SpringBoot启动时的生命周期事件和一些容器初始化器(`ApplicationContext` initializers),来执行一些SpringBoot启动时的初始化逻辑。
31+
32+
#### 3) spring-boot-autoconfigure
33+
这个模块跟SpringBoot的自动配置有关,也是SpringBoot的新特性之一。比如SpringBoot能基于类路径来自动配置某个项目模块,自动配置最为关键的注解是`@EnableAutoConfiguration`,这个注解能触发Spring上下文的自动配置。另外一个重要的注解是`@Conditional`
34+
> 举个栗子,若`HSQLDB`在项目的类路径中,且我们没有配置任何其他数据库的连接,此时自动配置就会自动根据类路径来创建相应的`bean`
35+
36+
除了根据类路径来进行自动配置外,还有根据容器中是否存在某个bean等方式来进行自动配置,这里不会进入到具体细节中。
37+
#### 4) spring-boot-starters
38+
这个模块是跟SpringBoot的起步依赖有关,也是SpringBoot的新特性之一。SpringBoot通过提供众多起步依赖降低项目依赖的复杂度。起步依赖其实就是利用maven项目模型将其他相关的依赖给聚合起来,里面各种依赖的版本号都给定义好,避免用户在引入依赖时出现各种版本冲突,方便了我们的使用。
39+
> 举个栗子,我们要用到activemq时,此时可以直接引入`spring-boot-starter-activemq`起步依赖即可,若SpringBoot官网或第三方组织没有提供相应的SpringBoot起步依赖时,此时我们可以进行定制自己的起步依赖。
40+
41+
注意,该模块没有代码,主要是通过maven的pom.xml来组织各种依赖。
42+
43+
44+
#### 5) spring-boot-cli
45+
Spring Boot CLI是一个命令行工具,如果您想使用Spring快速开发,可以使用它。它允许您运行Groovy脚本,这意味着您有一个熟悉的类似Java的语法,而没有那么多样板代码。您还可以引导一个新项目或编写自己的命令。
46+
#### 6) spring-boot-actuator
47+
这个跟SpringBoot的监控有关,也是SpringBoot的新特性之一。可以通过HTTP端点或JMX等来管理和监控应用。审计、运行状况和度量收集可以自动应用到应用程序。这个监控模块是开箱即用的,提供了一系列端点包括`HealthEndpoint`, `EnvironmentEndpoint``BeansEndpoint`等端点。
48+
#### 7) spring-boot-actuator-autoconfigure
49+
这个模块为监控模块提供自动配置的功能,通常也是根据类路径来进行配置。比如`Micrometer`存在于类路径中,那么将会自动配置`MetricsEndpoint`
50+
#### 8) spring-boot-test
51+
这个模式是spring-boot的跟测试有关的模块,包含了一些帮助我们测试的核心类和注解(比如`@SpringBootTest`)。
52+
53+
#### 9) spring-boot-dependencies
54+
这个模块也没有代码,主要是定义了一些SpringBoot的maven相关的一些依赖及其版本。
55+
#### 10) spring-boot-devtools
56+
这个模块跟SpringBoot的热部署有关,即修改代码后无需重启应用即生效。
57+
#### 11) spring-boot-docs
58+
这个模块应该是跟文档相关的模块。
59+
#### 12) spring-boot-properties-migrator
60+
看到 migrator 这个单词,估计就是跟项目迁移有关,没有去细
61+
究。
62+
#### 13) spring-boot-test-autoconfigure
63+
这个模块一看就是跟SpringBoot的测试的自动配置有关。
64+
#### 14) spring-boot-tools
65+
这个模块一看就是SpringBoot的工具相关的模块,提供了加载,maven插件,metadata和后置处理相关的支持。
66+
67+
上面介绍了这么多spring-boot模块下的子模块,不用慌,我们要进行解读的模块不多,我们真正要看的模块有`spring-boot`,`spring-boot-autoconfigure`,`spring-boot-starters``spring-boot-actuator`模块。
68+
69+
## 5 用一个思维导图来总结下SpringBoot源码项目的脉络
70+
71+
![](https://user-gold-cdn.xitu.io/2020/2/23/170728e220dc58a9?w=1247&h=749&f=png&s=281752)
72+
## 6 SpringBoot模块之间的pom关系详解
73+
前面弄清楚了SpringBoot的各个模块的具体功能,此时我们来看下SpringBoot模块的pom之间的关系是怎样的,因为项目是通过maven构建的,因此还是有必要去研究下这块关系滴。
74+
75+
先看SpringBoot源码项目的pom关系,如下图:
76+
77+
![](https://user-gold-cdn.xitu.io/2020/2/23/1707242f908d6dde?w=1122&h=565&f=png&s=51064)
78+
根据上图可得出以下结论:
79+
* `spring-boot-build(pom.xml)`是项目的根pom,其子pom有`spring-boot-project(pom.xml)``spring-boot-dependencies(pom.xml)`;
80+
* `spring-boot-dependencies(pom.xml)`主要定义了SpringBoot项目的各种依赖及其版本,其子pom有`spring-boot-parent(pom.xml)``spring-boot-starter-parent(pom.xml)`;
81+
* `spring-boot-project(pom.xml)`起到聚合module的作用,其子模块并不继承于它,而是继承于`spring-boot-parent(pom.xml)`;
82+
* `spring-boot-parent(pom.xml)``spring-boot-project(pom.xml)`的子module,但继承的父pom为`spring-boot-dependencies(pom.xml)`,其定义了一些properties等相关的东西。其子pom为`spring-boot-project(pom.xml)`的子module(注意除去`spring-boot-dependencies(pom.xml)`),比如有`spring-boot(pom.xml)`,`spring-boot-starters(pom.xml)``spring-boot-actuator(pom.xml)`等;
83+
* `spring-boot-starters(pom.xml)`是所有具体起步依赖的父pom,其子pom有`spring-boot-starter-data-jdbc(pom.xml)``spring-boot-starter-data-redis(pom.xml)`等。
84+
* `spring-boot-starter-parent(pom.xml)`,是我们的所有具体SpringBoot项目的父pom,比如SpringBoot自带的样例的`spring-boot-samples(pom.xml)`是继承于它的。
85+
86+
SpringBoot的各模块之间的pom关系有点复杂,确实有点绕,如果看完上面的图片和解释还是不太清楚的话,建议小伙伴们自己打开idea的项目,逐个去捋一下。总之记得SpringBoot的一些父pom无非是做了一些版本管理,聚合模块之间的事情。
87+
88+
## 5 小结
89+
好了,前面已经把SpringBoot源码项目的各个模块的功能和模块pom之间的关系给捋清楚了,总之刚开始分析项目源码,有一个整体的大局观很重要。
90+
91+
本来下节想先写SpringBoot的启动流程分析的,但由于之前研究过启动流程,所以就把启动流程分析放后点写了。下一节先对SpringBoot的新特性--自动配置的源码撸起来,因此下一节让我们先来揭开SpringBoot自动配置背后神秘的面纱吧,嘿嘿🤭。
92+
93+
**下节预告**:
94+
<font color=Blue>SpringBoot自动配置的相关原理搞起来</font>
95+
96+
97+
**原创不易,帮忙点个赞呗!**
98+
99+
参考:
100+
101+
1,https://github.com/spring-projects/spring-boot/tree/v2.1.0.RELEASE
102+
103+
2,https://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/reference/htmlsingle/#cli
104+
105+
---------------------------------------------------
106+
欢迎关注【源码笔记】公众号,一起学习交流。
107+
108+
<img src="https://user-gold-cdn.xitu.io/2020/3/13/170d433d335f79e2?w=160&h=166&f=png&s=46879" width = "100" height = "100" align=left />
109+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /