如何分析SpringBoot源码模块及结构?--SpringBoot源码(二)

简介: 如何分析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, EnvironmentEndpointBeansEndpoint等端点。

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-bootspring-boot-autoconfigurespring-boot-startersspring-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自动配置的相关原理搞起来

原创不易,帮忙点个赞呗!

参考:

1,https://github.com/spring-projects/spring-boot/tree/v2.1.0.RELEASE

2,https://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/reference/htmlsingle/#cli


欢迎关注【源码笔记】公众号,一起学习交流。

相关文章
|
20天前
|
缓存 前端开发 Java
【Java】仓库管理系统 SpringBoot+LayUI+DTree(源码)【独一无二】
【Java】仓库管理系统 SpringBoot+LayUI+DTree(源码)【独一无二】
|
1月前
|
前端开发 Java 关系型数据库
Springboot公交车路线管理系统 毕业设计-附源码
Springboot公交车路线管理系统 毕业设计-附源码
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
springboot基于人工智能和自然语言理解技术的医院智能导医系统源码
智能导诊系统可为患者提供线上挂号智能辅助服务,患者根据提示手动输入自己的基本症状,通过智能对话方式,该系统会依据大数据一步步帮助患者“诊断”,并最终推荐就医的科室和相关专家。患者可自主选择,实现“一键挂号”。这一模式将精确的导诊服务前置,从源头上让医疗服务更高效。
368 2
|
2天前
|
Web App开发 编解码 Java
B/S基层卫生健康云HIS医院管理系统源码 SaaS模式 、Springboot框架
基层卫生健康云HIS系统采用云端SaaS服务的方式提供,使用用户通过浏览器即能访问,无需关注系统的部署、维护、升级等问题,系统充分考虑了模板化、配置化、智能化、扩展化等设计方法,覆盖了基层医疗机构的主要工作流程,能够与监管系统有序对接,并能满足未来系统扩展的需要。
16 4
|
4天前
|
人工智能 移动开发 前端开发
Springboot医院智慧导诊系统源码:精准推荐科室
医院智慧导诊系统是在医疗中使用的引导患者自助就诊挂号,在就诊的过程中有许多患者不知道需要挂什么号,要看什么病,通过智慧导诊系统,可输入自身疾病的症状表现,或选择身体部位,在经由智慧导诊系统多维度计算,精准推荐科室,引导患者挂号就诊,实现科学就诊,不用担心挂错号。
10 2
|
5天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
30 10
|
5天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
6天前
|
存储 数据可视化 安全
Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术
智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境,这个一体化环境以各种应用服务系统为载体,将教学、科研、管理和校园生活进行充分融合。无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、丰富多彩的校园文化、方便周到的校园生活。简而言之,“要做一个安全、稳定、环保、节能的校园。
25 6
|
8天前
|
消息中间件 运维 供应链
springboot区域云HIS医院信息综合管理平台源码
云HIS系统分为两个大的系统,一个是基层卫生健康云综合管理系统,另一个是基层卫生健康云业务系统。基层卫生健康云综合管理系统由运营商、开发商和监管机构使用,用来进行运营管理、运维管理和综合监管。基层卫生健康云业务系统由基层医院使用,用来支撑医院各类业务运转。
19 2
|
20天前
|
JavaScript Java 关系型数据库
基于 java + Springboot + vue +mysql 大学生实习管理系统(含源码)
本文档介绍了基于Springboot的实习管理系统的设计与实现。系统采用B/S架构,旨在解决实习管理中的人工管理问题,提高效率。系统特点包括对用户输入的验证和数据安全性保障。功能涵盖首页、个人中心、班级管理、学生管理、教师管理、实习单位管理、实习作业管理、教师评分管理、单位成绩管理和系统管理等。用户分为管理员、教师和学生,各自有不同的操作权限。

热门文章

最新文章