如何分析SpringBoot源码模块及结构?--SpringBoot源码(二)
注:该源码分析对应SpringBoot版本为2.1.0.RELEASE
1 前言
本篇接
如何搭建自己的SpringBoot源码调试环境?--SpringBoot源码(一)。
前面搭建好了自己本地的SpringBoot源码调试环境后,此时我们不要急着下手进入到具体的源码调试细节中,刚开始阅读源码,此时我们一定要对项目结构等有一个整体的认识,然后再进行源码分析调试。推荐阅读下笔者之前写的的分析开源项目源码,我们该如何入手分析?一文,干货满满哦。
2 SpringBoot源码模块一览
我们先来对SpringBoot的源码模块来一个大致的了解,如下图:
从上图可以看到,主要有以下四个模块:
- spring-boot-project:整个SpringBoot框架全部功能在这个模块实现,SpringBoot项目95%的代码都在这里实现,源码总共有25万行左右。
- Spring-boot-samples:这个是SpringBoot给小伙伴们赠送的福利,里面包含了各种各样使用SpringBoot的简单demo,我们调试阅读源码的时候可以充分利用该模块。
- Spring-boot-sample-invoker:这个模块应该是跟sample模块有关,注意根pom.xml中有这么一句话:
Samples are built via the invoker plugin
,该模块无代码。 - Spring-boot-tests:这个模块SpringBoot的测试模块,跟部署测试和集成测试有关。
因为SpringBoot的全部功能在spring-boot-project模块实现,因此下面重点来介绍下 spring-boot-project 模块。
3 spring-boot-project源码模块详解
先来看下spring-boot-project整体模块结构,如下图,然后我们再逐个来介绍:
1) spring-boot-parent
这个模块没有代码,是spring-boot模块的父项目,被其他子模块继承。
2) spring-boot
这个模块是SpringBoot项目的核心,可以说一些基础核心的功能都在这里实现,为SpringBoot的其他模块组件功能提供了支持,主要包括以下核心功能:
SpringApplication
类,这个是SpringBoot的启动类,提供了一个静态的run
方法来启动程序,该类主要用来创建并且刷新Spring容器ApplicationContext
.- 支持选择不同的容器比如Tomcat,Jetty等来作为应用的嵌入容器,这个是SpringBoot的新特性之一。
- 外部配置支持,这个指的是我们执行
java -jar xxx.jar
命令时可以带一些参数,比如执行java -jar demo.jar --server.port=8888
来将应用端口修改为8888. - 该模块内置了一些SpringBoot启动时的生命周期事件和一些容器初始化器(
ApplicationContext
initializers),来执行一些SpringBoot启动时的初始化逻辑。
3) spring-boot-autoconfigure
这个模块跟SpringBoot的自动配置有关,也是SpringBoot的新特性之一。比如SpringBoot能基于类路径来自动配置某个项目模块,自动配置最为关键的注解是@EnableAutoConfiguration
,这个注解能触发Spring上下文的自动配置。另外一个重要的注解是@Conditional
。
举个栗子,若
HSQLDB
在项目的类路径中,且我们没有配置任何其他数据库的连接,此时自动配置就会自动根据类路径来创建相应的bean
。
除了根据类路径来进行自动配置外,还有根据容器中是否存在某个bean等方式来进行自动配置,这里不会进入到具体细节中。
4) spring-boot-starters
这个模块是跟SpringBoot的起步依赖有关,也是SpringBoot的新特性之一。SpringBoot通过提供众多起步依赖降低项目依赖的复杂度。起步依赖其实就是利用maven项目模型将其他相关的依赖给聚合起来,里面各种依赖的版本号都给定义好,避免用户在引入依赖时出现各种版本冲突,方便了我们的使用。
举个栗子,我们要用到activemq时,此时可以直接引入
spring-boot-starter-activemq
起步依赖即可,若SpringBoot官网或第三方组织没有提供相应的SpringBoot起步依赖时,此时我们可以进行定制自己的起步依赖。
注意,该模块没有代码,主要是通过maven的pom.xml来组织各种依赖。
5) spring-boot-cli
Spring Boot CLI是一个命令行工具,如果您想使用Spring快速开发,可以使用它。它允许您运行Groovy脚本,这意味着您有一个熟悉的类似Java的语法,而没有那么多样板代码。您还可以引导一个新项目或编写自己的命令。
6) spring-boot-actuator
这个跟SpringBoot的监控有关,也是SpringBoot的新特性之一。可以通过HTTP端点或JMX等来管理和监控应用。审计、运行状况和度量收集可以自动应用到应用程序。这个监控模块是开箱即用的,提供了一系列端点包括HealthEndpoint
, EnvironmentEndpoint
和BeansEndpoint
等端点。
7) spring-boot-actuator-autoconfigure
这个模块为监控模块提供自动配置的功能,通常也是根据类路径来进行配置。比如Micrometer
存在于类路径中,那么将会自动配置MetricsEndpoint
。
8) spring-boot-test
这个模式是spring-boot的跟测试有关的模块,包含了一些帮助我们测试的核心类和注解(比如@SpringBootTest
)。
9) spring-boot-dependencies
这个模块也没有代码,主要是定义了一些SpringBoot的maven相关的一些依赖及其版本。
10) spring-boot-devtools
这个模块跟SpringBoot的热部署有关,即修改代码后无需重启应用即生效。
11) spring-boot-docs
这个模块应该是跟文档相关的模块。
12) spring-boot-properties-migrator
看到 migrator 这个单词,估计就是跟项目迁移有关,没有去细
究。
13) spring-boot-test-autoconfigure
这个模块一看就是跟SpringBoot的测试的自动配置有关。
14) spring-boot-tools
这个模块一看就是SpringBoot的工具相关的模块,提供了加载,maven插件,metadata和后置处理相关的支持。
上面介绍了这么多spring-boot模块下的子模块,不用慌,我们要进行解读的模块不多,我们真正要看的模块有spring-boot
,spring-boot-autoconfigure
,spring-boot-starters
和spring-boot-actuator
模块。
5 用一个思维导图来总结下SpringBoot源码项目的脉络
6 SpringBoot模块之间的pom关系详解
前面弄清楚了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无非是做了一些版本管理,聚合模块之间的事情。
5 小结
好了,前面已经把SpringBoot源码项目的各个模块的功能和模块pom之间的关系给捋清楚了,总之刚开始分析项目源码,有一个整体的大局观很重要。
本来下节想先写SpringBoot的启动流程分析的,但由于之前研究过启动流程,所以就把启动流程分析放后点写了。下一节先对SpringBoot的新特性--自动配置的源码撸起来,因此下一节让我们先来揭开SpringBoot自动配置背后神秘的面纱吧,嘿嘿
如何分析SpringBoot源码模块及结构?--SpringBoot源码(二)的更多相关文章
- SpringBoot+Maven 多模块项目的构建、运行、打包实战
前言 最近在做一个很复杂的会员综合线下线上商城大型项目,单模块项目无法满足多人开发和架构,很多模块都是重复的就想到了把模块提出来,做成公共模块,基于maven的多模块项目,也好分工开发,也便于后期微服 ...
- Python 源码分析:queue 队列模块
起步 queue 模块提供适用于多线程编程的先进先出(FIFO)数据结构.因为它是线程安全的,所以多个线程很轻松地使用同一个实例. 源码分析 先从初始化的函数来看: 从这初始化函数能得到哪些信息呢?首 ...
- jQuery1.9.1源码分析--数据缓存Data模块
jQuery1.9.1源码分析--数据缓存Data模块 阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(el ...
- jQuery 源码分析(十) 数据缓存模块 data详解
jQuery的数据缓存模块以一种安全的方式为DOM元素附加任意类型的数据,避免了在JavaScript对象和DOM元素之间出现循环引用,以及由此而导致的内存泄漏. 数据缓存模块为DOM元素和JavaS ...
- 如何搭建自己的SpringBoot源码调试环境?--SpringBoot源码(一)
1 前言 这是SpringBoot2.1源码分析专题的第一篇文章,主要讲如何来搭建我们的源码阅读调试环境.如果有经验的小伙伴们可以略过此篇文章. 2 环境安装要求 IntelliJ IDEA JDK1 ...
- abp vnext2.0之核心组件模块加载系统源码解析与简单应用
abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...
- SpringBoot快速入门(解析+入门案例源码实现)
这里写目录标题 SpringBoot入门 一.SpringBoot 概念 二.JavaConfig 入门 1. JavaConfig 概念 2. 项目准备 三.常用注解 四.SpringBoot 入门 ...
- Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装
原文:Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装 Linux内核分析(一) 从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底 ...
- 读Zepto源码之代码结构
虽然最近工作中没有怎么用 zepto ,但是据说 zepto 的源码比较简单,而且网上的资料也比较多,所以我就挑了 zepto 下手,希望能为以后阅读其他框架的源码打下基础吧. 源码版本 本文阅读的源 ...
随机推荐
- IntelliJ的.iml文件及相关的Class Not Found 问题
.iml 文件是IntelliJ IDEA 自动创建的模块文件,用于Java应用开发,存储一些模块开发相关的信息,比如一个Java组件, 插件组件,Maven组件等等, 还可能会存储一些模块路径信息, ...
- 【Java集合】试读ArrayList源码
ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess, ...
- Kintinuous解析
版权声明:本文为博主原创文章,未经博主允许不得转载. Kintinuous是Thomas Whelan在National University of Ireland Maynooth读博期间的工作,有 ...
- FPGA基础架构总结
1.为什么FPGA的整体逻辑的速度有限制? 与ASIC相比较,AS指的是(application specific)专用集成应用,而FPGA是可编程逻辑,在实现的过程中,AS是直接用最基础的逻辑门实现 ...
- MOOC(6)- case之间存在依赖
方法1:这里只给出根据依赖字段去匹配响应结果中的值的函数,其他匹配依赖case,对依赖case发起请求见下面的方法2 方法2: from day_20200208_mooc.tools.do_exce ...
- 实战:CentOS 7.2 / Zabbix3.4安装graphtrees
众所周知的 Zabbix图形显示问题,决定使用graphtrees 插件. 环境:CentOS7.2 + Zabbix 3.4 1)首先切换到root用户以获得足够的权限将资源下载到 /usr/sha ...
- Ionic3 Demo
本文为原创文章,转载请标明出处 最近又开源了一个小 Demo,基于 Ionic 3.9.2.注册登录功能使用的是 WildDog 野狗通信云,大家可以放心的注册登录玩.电影相关数据来源自"某 ...
- 吴裕雄--天生自然 R语言开发学习:基本图形(续三)
#---------------------------------------------------------------# # R in Action (2nd ed): Chapter 6 ...
- numpy array 分割
import numpy as np A = np.array([1,1,1])[:,np.newaxis] B = np.array([2,2,2])[:,np.newaxis] #合并 C = n ...
- 吴裕雄--天生自然 python开发学习笔记:pycharm无法使用ctrl+c/v复制粘贴的问题
在使用pycharm的时候发现不能正常使用ctrl+c/v进行复制粘贴,也无法使用tab键对大段代码进行整体缩进.后来发现是因为安装了vim插件的问题,在setting里找到vim插件,取消勾选即可解 ...