该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读

Spring Boot 版本:2.2.x

最好对 Spring 源码有一定的了解,可以先查看我的 《死磕 Spring 之 IoC 篇 - 文章导读》 系列文章

如果该篇内容对您有帮助,麻烦点击一下“推荐”,也可以关注博主,感激不尽~

序言

前面一系列的文章对 MyBatis、Spring MVC、Spring IoC、Spring AOP 和 Spring TX 的源码进行了比较详细的分析,不知道各位小伙伴看了多少内容。我想,学习源码是一个比较枯燥乏味的过程,需要静下心来学习,你也许会感觉学不到什么,所以会有多少小伙伴认真看这种文章呢?不管怎样,还是希望文章对你有帮助。 我呢,还是本着学习与分享的目的,继续我的知识分享,希望能够一直坚持下去。

现如今,Spring BootSpring Cloud 在许多中大型企业中被普及,Java Configuration 成为了主流,XML 配置的方式也逐渐“消失”在我们的视野里面。前面我们已经学完 Spring 相关的源码,那么接下来一起来学习 Spring Boot 的源码,揭开它神秘的面纱。

如果你对 Spring 的源码有比较充分的了解,那么阅读 Spring Boot 的源码会比较轻松,我花了一周左右时间,应该看得差不多了 所以对于 Spring 源码不熟悉的小伙伴,如果有兴趣的话,可以先去看看我前面的一系列文章。

接下来 Spring Boot 系列文章主要分为以下几个部分:

  • 调试环境的搭建与项目结构概述
  • Spring Boot 应用打成 jar 包的启动实现
  • Spring Boot 的 SpringApplication 启动类的启动过程
  • Spring Boot 内嵌 Tomcat 容器的实现
  • Spring Boot 支持外部 Tomcat 容器的实现
  • @SpringBootApplication 注解的实现原理,也就是 Spring Boot 的 @EnableAutoConfiguration 自动配置模块驱动注解的实现原理
  • Spring Boot 对于 Condition 接口的扩展
  • Spring Boot 的配置加载 - ConfigFileApplicationListener
  • Spring Boot 的日志系统 - LoggingApplicationListener
  • Spring Boot 的 @ConfigurationProperties 注解的实现

接下来我们先把 Spring Boot 的调试环境搭建好

依赖工具

  • Maven 3.6.3
  • Git
  • JDK 1.8+
  • IntelliJ IDEA 2020.1.1

笔者目前使用的是 Windows 系统,如果使用的是系统版本是 MAC OS 或者其他 IDEA 版本,可能会遇到相关问题,需自行 Google 处理。

源码拉取

Spring Boot 的 Git 仓库 Fork 项目到自己的 Git 仓库,方便我们在阅读源码的过程中,可添加相应的注释后提交代码。分支建议选择 2.2.x 作为默认分支,因为这个分支使用 Maven 管理依赖包(后续新的版本都是 Gradle),大多数人还是更加熟悉 Maven,所以笔者选择了 2.2.x 这个分支进行源码阅读。

当然,也可以直接拉取我的 Spring Boot 源码分析 GitHub 地址 进行阅读,根据我添加的注释结合我的文章进行阅读,体验更佳。

由于 Spring Boot 项目比较大,从仓库中拉取代码的时间会比较长,因为 Build 过程需要下载非常多的依赖,请耐心等待。

可能遇到的问题

  1. 在根目录的 pom.xml 看到 ${disable.checks} 报错,可以添加一个配置,禁用 Maven 代码检查,如下:

    <properties>
    <revision>2.2.14.BUILD-SNAPSHOT</revision>
    <main.basedir>${basedir}</main.basedir>
    <!-- 禁用 Maven 代码检查 -->
    <disable.checks>true</disable.checks>
    </properties>
  2. 对整个工程进行编译的过程中出现 rabbit 相关包没有权限拉取的错误,可修改根目录 pom.xmlrabbit-milestone 仓库配置,如下:

    <repository>
    <id>rabbit-milestone</id>
    <name>Rabbit Milestone</name>
    <!-- https://dl.bintray.com/rabbitmq/maven-milestones -->
    <url>https://repos.spark-packages.org</url>
    <snapshots>
    <enabled>false</enabled>
    </snapshots>
    </repository>
  3. 如果编译的过程中还出现 Cannot resolve 的错误,可以试着将自己的私有仓库注释掉,使用阿里云的 Maven 仓库。

项目结构概览

整个 spring-boot 工程项目结构如下:

spring-boot
---- spring-boot-project
-------- spring-boot
-------- spring-boot-actuator
-------- spring-boot-actuator-autoconfigure
-------- spring-boot-autoconfigure
-------- spring-boot-cli
-------- spring-boot-dependencies
-------- spring-boot-devtools
-------- spring-boot-docs
-------- spring-boot-parent
-------- spring-boot-properties-migrator
-------- spring-boot-starters
-------- spring-boot-test
-------- spring-boot-test-autoconfigure
-------- spring-boot-tools
-------- pom.xml
---- spring-boot-tests
---- pom.xml

各个子模块的描述:

spring-boot-tests:项目的测试类

spring-boot-project:整个 Spring Boot 项目的实现,包含了许多个子模块,如下:

  1. spring-boot(核心):Spring Boot 的核心实现,根据包名可以知道哪些功能是在哪些包下实现的

  2. spring-boot-autoconfigure(核心):Spring Boot 自动配置的实现,也就是在 Spring 中很多需要通过 XML 配置的类在这里会通过注解进行配置注入(如果可以的话),自动配置,简化 Spring 应用

  3. spring-boot-starters(核心):提供许多常用组件的 Starter 模块,没有相关 Java 代码,仅仅是一个 pom.xml 文件,里面引入组件的相关依赖,帮助我们快速引入组件并使用;通常一个 Spring Boot Starter 需要结合 autoconfigure 自动配置一起引入,这样就能够快速启动

  4. spring-boot-test:提供单元测试的支持

  5. spring-boot-test-autoconfigure:提供单元测试的自动配置功能

  6. spring-boot-tools:Spring Boot 提供的工具箱

    例如其中的 spring-boot-maven-plugin 子模块可以帮助我们将自己的项目打成一个 jar 包,还有一个 spring-boot-loader 子模块是启动 jar 包的实现,例如 java -jar x.jar(这个 jar 包是 Spring Boot 插件生成的)启动应用时,并不是直接调用我们的 main 方法,而是调用 spring-boot-loader 模块中的启动方法,后面会讲到~

  7. spring-boot-devtools:提供应用热部署的支持

  8. spring-boot-actuator:提供对我们的应用健康检查和监控的功能

  9. spring-boot-actuator-autoconfigure:提供 spring-boot-actuator 自动配置功能

  10. spring-boot-parent:无 Java 代码,仅一个 pom.xml 文件,是其他子模块的 parent

    我们可以设置自己项目的 parentspring-boot-parent 来引入 Spring Boot

  11. spring-boot-dependencies:无 Java 代码,仅一个 pom.xml 文件,是 spring-boot-parentparent,里面配置了当前 Spring Boot 版本对应其他组件的版本信息

    我们可以添加 spring-boot-dependencies 依赖来引入 Spring Boot(推荐)

代码统计

通过 IDEA Statistic 插件,分别统计了一下两个模块的代码量,如下:

spring-boot

spring-boot-autoconfigure

可以看到这两个模块加起来的代码有点多,不过除去注释什么的也没多少,既然我们都看过 Spring Framework 了,这也不算什么了

接下来,开始我们的 Spring Boot 源码学习之旅‍

精尽Spring Boot源码分析 - 序言的更多相关文章

  1. 精尽Spring Boot源码分析 - 文章导读

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  2. 精尽Spring Boot源码分析 - SpringApplication 启动类的启动过程

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  3. 精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  4. 精尽Spring Boot源码分析 - 支持外部 Tomcat 容器的实现

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  5. 精尽Spring Boot源码分析 - 剖析 @SpringBootApplication 注解

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  6. 精尽Spring Boot源码分析 - Condition 接口的扩展

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  7. 精尽Spring Boot源码分析 - 配置加载

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  8. 精尽Spring Boot源码分析 - 日志系统

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  9. 精尽Spring Boot源码分析 - @ConfigurationProperties 注解的实现

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

随机推荐

  1. 测试报告$\beta$

    VisualPytorch beta发布了! 功能概述:通过可视化拖拽网络层方式搭建模型,可选择不同数据集.损失函数.优化器生成可运行pytorch代码 扩展功能:1. 模型搭建支持模块的嵌套:2. ...

  2. SQLFlow的几种关系

    SQLFlow的几种关系 SQLFlow可以用来分析各种数据对象之间的依赖关系,其中包含了fdd, fdr, frd, join 四种关系 fdd:表示数据从源列到目标列的关系 frd:表示结果集返回 ...

  3. [bug] Openresty:content_by_lua_file 404

    参考 http://www.javaear.com/question/28087228.html https://github.com/openresty/openresty.org/issues/1 ...

  4. Spark 集群安装部署

    安装准备 Spark 集群和 Hadoop 类似,也是采用主从架构,Spark 中的主服务器进程就叫 Master(standalone 模式),从服务器进程叫 Worker Spark 集群规划如下 ...

  5. Ansible_管理playbook实现配置并行

    一.使用forks在Ansible中配置并行 1.Aniable运行play机制 1️⃣:当Ansible处理playbook时,会按顺序运行每个play.确定play的主机列表之后,Ansible将 ...

  6. linux系统的负载详解

    系统的平均负载 如何理解平均负载 ​ 单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数. 平均负载多少合理 核心数 平均负载 含义 4 2 有50%的cpu是空闲状态,见 ...

  7. Redis I/O 多路复用技术原理

    引言 Redis 是一个单线程却性能非常好的内存数据库, 主要用来作为缓存系统. Redis 采用网络 I/O 多路复用技术来保证在多个连接时,系统的高吞吐量(TPS). 系统吞吐量(TPS)指的是系 ...

  8. webpack(2)--webapck自身的配置

    上一记介绍了webpack的安装和基本配置,本记将描述webpack自身的配置 一:指定webpack入口以及出口目录以及输出文件 相信读者在看完上一记后会有一点疑惑:为什么运行webpack要配置s ...

  9. VBScript学习第一天

    编码工具:VbsEdit 1.MsgBox() 毫无例外,第一个要学的就是"Hello, World!" 直接输入: MsgBox ("Hello, World!&quo ...

  10. 稀疏自编码器及TensorFlow实现

    自动编码机更像是一个识别网络,只是简单重构了输入.而重点应是在像素级重构图像,施加的唯一约束是隐藏层单元的数量. 有趣的是,像素级重构并不能保证网络将从数据集中学习抽象特征,但是可以通过添加更多的约束 ...