注:该源码分析对应SpringBoot版本为2.1.0.RELEASEjava
本篇接
如何搭建本身的SpringBoot源码调试环境?--SpringBoot源码(一)。redis
前面搭建好了本身本地的SpringBoot源码调试环境后,此时咱们不要急着下手进入到具体的源码调试细节中,刚开始阅读源码,此时咱们必定要对项目结构等有一个总体的认识,而后再进行源码分析调试。推荐阅读下笔者以前写的的分析开源项目源码,咱们该如何入手分析?一文,干货满满哦。spring
咱们先来对SpringBoot的源码模块来一个大体的了解,以下图:数据库
从上图能够看到,主要有如下四个模块:框架
Samples are built via the invoker plugin
,该模块无代码。由于SpringBoot的所有功能在spring-boot-project模块实现,所以下面重点来介绍下 spring-boot-project 模块。maven
先来看下spring-boot-project总体模块结构,以下图,而后咱们再逐个来介绍:ide
这个模块没有代码,是spring-boot模块的父项目,被其余子模块继承。spring-boot
这个模块是SpringBoot项目的核心,能够说一些基础核心的功能都在这里实现,为SpringBoot的其余模块组件功能提供了支持,主要包括如下核心功能:工具
SpringApplication
类,这个是SpringBoot的启动类,提供了一个静态的run
方法来启动程序,该类主要用来建立而且刷新Spring容器ApplicationContext
.java -jar xxx.jar
命令时能够带一些参数,好比执行java -jar demo.jar --server.port=8888
来将应用端口修改成8888.ApplicationContext
initializers),来执行一些SpringBoot启动时的初始化逻辑。这个模块跟SpringBoot的自动配置有关,也是SpringBoot的新特性之一。好比SpringBoot能基于类路径来自动配置某个项目模块,自动配置最为关键的注解是@EnableAutoConfiguration
,这个注解能触发Spring上下文的自动配置。另一个重要的注解是@Conditional
。源码分析
举个栗子,若
HSQLDB
在项目的类路径中,且咱们没有配置任何其余数据库的链接,此时自动配置就会自动根据类路径来建立相应的bean
。
除了根据类路径来进行自动配置外,还有根据容器中是否存在某个bean等方式来进行自动配置,这里不会进入到具体细节中。
这个模块是跟SpringBoot的起步依赖有关,也是SpringBoot的新特性之一。SpringBoot经过提供众多起步依赖下降项目依赖的复杂度。起步依赖其实就是利用maven项目模型将其余相关的依赖给聚合起来,里面各类依赖的版本号都给定义好,避免用户在引入依赖时出现各类版本冲突,方便了咱们的使用。
举个栗子,咱们要用到activemq时,此时能够直接引入
spring-boot-starter-activemq
起步依赖便可,若SpringBoot官网或第三方组织没有提供相应的SpringBoot起步依赖时,此时咱们能够进行定制本身的起步依赖。
注意,该模块没有代码,主要是经过maven的pom.xml来组织各类依赖。
Spring Boot CLI是一个命令行工具,若是您想使用Spring快速开发,可使用它。它容许您运行Groovy脚本,这意味着您有一个熟悉的相似Java的语法,而没有那么多样板代码。您还能够引导一个新项目或编写本身的命令。
这个跟SpringBoot的监控有关,也是SpringBoot的新特性之一。能够经过HTTP端点或JMX等来管理和监控应用。审计、运行情况和度量收集能够自动应用到应用程序。这个监控模块是开箱即用的,提供了一系列端点包括HealthEndpoint
, EnvironmentEndpoint
和BeansEndpoint
等端点。
这个模块为监控模块提供自动配置的功能,一般也是根据类路径来进行配置。好比Micrometer
存在于类路径中,那么将会自动配置MetricsEndpoint
。
这个模式是spring-boot的跟测试有关的模块,包含了一些帮助咱们测试的核心类和注解(好比@SpringBootTest
)。
这个模块也没有代码,主要是定义了一些SpringBoot的maven相关的一些依赖及其版本。
这个模块跟SpringBoot的热部署有关,即修改代码后无需重启应用即生效。
这个模块应该是跟文档相关的模块。
看到 migrator 这个单词,估计就是跟项目迁移有关,没有去细
究。
这个模块一看就是跟SpringBoot的测试的自动配置有关。
这个模块一看就是SpringBoot的工具相关的模块,提供了加载,maven插件,metadata和后置处理相关的支持。
上面介绍了这么多spring-boot模块下的子模块,不用慌,咱们要进行解读的模块很少,咱们真正要看的模块有spring-boot
,spring-boot-autoconfigure
,spring-boot-starters
和spring-boot-actuator
模块。
前面弄清楚了SpringBoot的各个模块的具体功能,此时咱们来看下SpringBoot模块的pom之间的关系是怎样的,由于项目是经过maven构建的,所以仍是有必要去研究下这块关系滴。
先看SpringBoot源码项目的pom关系,以下图:
根据上图可得出如下结论:
spring-boot-build(pom.xml)
是项目的根pom,其子pom有spring-boot-project(pom.xml)
和spring-boot-dependencies(pom.xml)
;spring-boot-dependencies(pom.xml)
主要定义了SpringBoot项目的各类依赖及其版本,其子pom有spring-boot-parent(pom.xml)
和spring-boot-starter-parent(pom.xml)
;spring-boot-project(pom.xml)
起到聚合module的做用,其子模块并不继承于它,而是继承于spring-boot-parent(pom.xml)
;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)
等;spring-boot-starters(pom.xml)
是全部具体起步依赖的父pom,其子pom有spring-boot-starter-data-jdbc(pom.xml)
和spring-boot-starter-data-redis(pom.xml)
等。spring-boot-starter-parent(pom.xml)
,是咱们的全部具体SpringBoot项目的父pom,好比SpringBoot自带的样例的spring-boot-samples(pom.xml)
是继承于它的。SpringBoot的各模块之间的pom关系有点复杂,确实有点绕,若是看完上面的图片和解释仍是不太清楚的话,建议小伙伴们本身打开idea的项目,逐个去捋一下。总之记得SpringBoot的一些父pom无非是作了一些版本管理,聚合模块之间的事情。
好了,前面已经把SpringBoot源码项目的各个模块的功能和模块pom之间的关系给捋清楚了,总之刚开始分析项目源码,有一个总体的大局观很重要。
原本下节想先写SpringBoot的启动流程分析的,但因为以前研究过启动流程,因此就把启动流程分析放后点写了。下一节先对SpringBoot的新特性--自动配置的源码撸起来,所以下一节让咱们先来揭开SpringBoot自动配置背后神秘的面纱吧,嘿嘿