spring boot 源码解读与原理分析
一、概述
Spring Boot是一个基于Spring框架的开源项目,旨在简化Spring应用程序的创建和部署。它通过自动配置和约定大于配置的原则,使得开发者能够快速构建独立、可运行的、生产级别的Spring应用程序。本文将对Spring Boot的源码进行解读,并深入分析其工作原理。
二、Spring Boot工作原理
Spring Boot的核心功能在于自动配置和启动应用程序。下面我们深入分析一下这两个过程。
1、Spring Boot的自动配置机制是其核心特性之一,它能够根据应用程序的依赖和配置,自动配置和初始化各种组件和功能。以下是Spring Boot自动配置机制的详细解释:
-
自动配置原理:
- Spring Boot通过分析classpath下的依赖关系,自动配置应用程序。它利用了Spring框架的Environment抽象和条件注解,根据不同环境和依赖版本,动态地加载和配置Bean。
- Spring Boot的核心是SpringFactoriesLoader类,它通过加载每个jar包中的META-INF/spring.factories文件,自动注册配置源。这些配置源通常是一些自动配置类,包含了应用程序的自动配置信息。
-
spring.factories文件:
- 在Spring Boot中,每个jar包都有一个META-INF/spring.factories文件。这个文件包含了各种配置源的注册信息,包括自动配置类、条件注解等。
- 开发人员可以自定义自动配置类,并在spring.factories文件中注册它们。这样,当应用程序满足特定条件时,这些自定义的自动配置类就会被加载并执行相应的配置操作。
-
条件注解:
- Spring Boot使用了条件注解来判断是否需要自动配置某个Bean。例如,只有当某个特定的依赖存在于classpath中时,某个自动配置类才会被加载。
- 这些条件注解包括@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty等。它们允许开发者根据特定的条件来决定是否应用某个配置。
-
自动配置类:
- 自动配置类是包含应用程序自动配置信息的类。这些类通常实现了AutoConfiguration接口,并使用@Configuration和@ComponentScan注解来标记。
- 在自动配置类中,开发者可以定义一系列的Bean和相关的初始化代码。这些Bean将被自动注册到Spring的ApplicationContext中,并由Spring容器管理它们的生命周期。
-
默认配置与自定义配置:
- Spring Boot提供了默认的自动配置规则和默认的配置选项。这些默认配置覆盖了许多常见的用例,使得开发者能够快速搭建一个可运行的应用程序。
- 开发者也可以根据具体需求自定义自动配置。通过编写自定义的自动配置类,开发者可以覆盖或扩展默认的自动配置规则,以满足特定应用程序的需求。
-
扩展点与自定义:
- Spring Boot的自动配置机制提供了许多扩展点,允许开发者自定义和扩展其功能。例如,开发者可以编写自定义的条件注解、自动配置类或自定义的Bean定义等。
- 通过扩展点,开发者可以更加灵活地控制应用程序的自动配置过程,并实现更加复杂的配置逻辑。
-
总结:
- Spring Boot的自动配置机制大大简化了应用程序的配置过程,减少了手动编写大量代码的需求。它利用了依赖关系、条件注解和自动配置类等技术,实现了根据应用程序的依赖和环境动态地加载和初始化Bean的功能。通过自定义和扩展自动配置机制,开发者可以更加灵活地控制应用程序的行为和功能。
2、Spring Boot的启动应用程序主要涉及以下几个关键步骤:
-
应用程序入口:
- Spring Boot应用程序通常有一个主类,该类包含一个静态的
main方法,作为应用程序的入口点。开发者只需运行这个主方法即可启动应用程序。
- Spring Boot应用程序通常有一个主类,该类包含一个静态的
-
创建SpringApplication对象:
- 在启动应用程序时,首先会创建一个SpringApplication对象。这个对象是Spring Boot应用程序的核心,它封装了与Spring框架的交互和配置。
- SpringApplication对象负责管理应用程序的上下文和事件循环。它还提供了与外部环境的交互能力,例如读取配置文件和外部化配置。
-
加载配置文件:
- SpringApplication对象会根据在主类上定义的
@SpringBootApplication注解或其他配置来加载应用程序的配置文件。 - 默认情况下,Spring Boot会查找
application.properties或application.yml文件作为配置文件。这些文件包含了应用程序的各种配置属性,如数据库连接、端口号等。
- SpringApplication对象会根据在主类上定义的
-
创建ApplicationContext:
- 创建完SpringApplication对象后,接下来会创建一个ApplicationContext对象。这个对象是Spring框架的核心,负责管理应用程序中所有的Bean。
- ApplicationContext是一个容器,它包含了应用程序中定义的所有Bean,并负责它们的生命周期管理、依赖注入等操作。
-
注册Bean:
- 在创建ApplicationContext的过程中,Spring Boot会自动扫描并注册应用程序中的Bean。这些Bean可以是普通的Java对象、服务、控制器等。
- Spring Boot通过自动配置机制,根据依赖关系和条件判断,自动地创建和配置这些Bean。这大大简化了Bean的注册和管理过程。
-
启动Web服务器:
- 如果你的应用程序是一个Web应用程序,Spring Boot会自动启动一个内嵌的Web服务器(如Tomcat)。这个服务器负责处理HTTP请求和响应。
- 开发者无需手动部署WAR文件或配置外部Web服务器。通过内嵌的Web服务器,Spring Boot简化了Web应用程序的部署和启动过程。
-
事件监听与处理:
- Spring Boot应用程序的事件处理机制允许开发者监听各种事件,例如ContextRefreshedEvent、ApplicationStartedEvent等。通过监听这些事件,开发者可以执行特定的初始化逻辑或自定义操作。
-
总结:
- Spring Boot的启动过程是一个自动化的过程,它简化了Spring应用程序的创建和部署。通过自动配置机制和内嵌的Web服务器,开发者可以快速搭建一个功能齐全、易于部署的Spring应用程序。
三、Spring Boot源码解读
下面我们详细解读一下Spring Boot的源码。
- SpringApplication类
SpringApplication类是Spring Boot应用程序的入口点。它主要负责创建ConfigurableEnvironment对象和ApplicationContext对象,并启动Web服务器。在SpringApplication类中,我们可以看到以下几个关键方法:
- run(…):启动应用程序。该方法会创建一个ConfigurableEnvironment对象和一个ApplicationContext对象,然后启动Web服务器。
- createApplicationContext(…):创建ApplicationContext对象。该方法会根据应用程序的配置信息创建一个ApplicationContext对象,并将该对象返回给调用者。
- SpringApplicationRunListeners类
SpringApplicationRunListeners类是一个监听器类,用于监听应用程序的启动过程。它包含了一系列的事件处理器,用于处理应用程序启动过程中的各种事件,如contextRefreshed事件、contextStarted事件等。通过这些事件处理器,我们可以对应用程序的启动过程进行自定义操作,例如记录日志、发送通知等。
-
自动配置机制:
- 依赖关系: Spring Boot通过分析classpath下的依赖关系来自动配置应用程序。它利用了Spring的Environment抽象,根据不同环境(开发、测试、生产)和依赖版本,动态地加载和配置Bean。
- PropertySourcesPlaceholderConfigurer: 这是自动配置的核心类之一,负责处理属性文件的加载和解析。Spring Boot会自动配置这个类,以便从
application.properties或application.yml文件中加载配置。 - 条件注解: Spring Boot使用了条件注解来判断是否需要自动配置某个Bean。例如,只有当某个特定的依赖存在于classpath中时,某个自动配置类才会被加载。
-
快速启动:
- 内嵌Web容器: Spring Boot内嵌了Tomcat、Jetty等Web容器,使得开发者无需单独部署WAR文件。这大大简化了启动过程。
- 嵌入式Servlet容器启动器: Spring Boot提供了一个嵌入式Servlet容器启动器,用于启动内嵌的Web容器。这个启动器负责加载Spring的ApplicationContext,并启动Web服务器。
-
确定性加载:
- Spring Boot遵循“约定优于配置”的原则,尽可能地减少开发者需要手动配置的内容。通过这种方式,Spring Boot可以确保在大多数情况下,应用程序的行为是可预测的。
-
配置中心:
- 除了基于属性的配置外,Spring Boot还支持外部化的、集中式的配置中心。通过这些配置中心,开发者可以动态地更改应用程序的配置,而无需重启应用程序。
-
插件机制:
- Spring Boot提供了插件机制,允许开发者扩展其功能。例如,你可以通过添加特定的starter依赖来启用某个功能,如消息队列、缓存等。
-
Spring Boot Starter:
- Spring Boot Starter是一个特殊的项目模板,用于简化基于Spring Boot的应用程序的开发。通过使用Starter,你可以快速搭建一个独立的、可运行的Spring应用程序,并获得所有Spring Boot的特性。
-
引导过程:
- Spring Boot应用程序的引导过程包括以下几个步骤:加载配置文件、创建SpringApplication对象、创建ApplicationContext、启动Web服务器。这个过程是自动完成的,开发者只需简单地运行一个主函数即可启动应用程序。
-
应用上下文:
- Spring Boot的ApplicationContext负责管理Bean的生命周期和依赖关系。当应用程序启动时,Spring Boot会自动创建这个上下文,并加载所有的Bean定义。
-
Spring Boot CLI:
- Spring Boot还提供了一个命令行界面工具,可以帮助开发者快速生成项目骨架和运行应用程序。通过使用CLI,你可以减少大量手动配置和编码的工作量。
-
健康检查和指标:
- Spring Boot提供了开箱即用的健康检查和指标功能。这些功能使得开发者可以轻松地监控应用程序的运行状态和性能指标。通过REST API,这些信息可以轻松地被集成到监控和报警系统中。
- 安全性:
- Spring Boot支持各种安全框架,如Spring Security。通过简单的配置和注解,你可以轻松地实现认证、授权和加密等功能。
- 日志和监控:
- Spring Boot集成了Spring Boot Actuator模块,该模块提供了丰富的监控和日志功能。通过Actuator提供的REST API,你可以轻松地获取应用程序的运行时信息、健康状况等。此外,Actuator还提供了敏感信息的保护和自定义监控仪表盘的功能。
- 集成测试:
- Spring Boot支持集成测试,使得开发者可以轻松地对基于Spring Boot的应用程序进行测试。通过使用Spring Test框架,你可以编写单元测试、集成测试和端到端测试,以确保应用程序的正确性和稳定性。
- 多模块项目支持:
- Spring Boot支持多模块项目的开发。每个模块都可以独立编译和打包,并且可以通过简单的依赖管理来集成各个模块的功能。这使得大型项目的开发和维护变得更加容易和高效。
相关文章:
spring boot 源码解读与原理分析
一、概述 Spring Boot是一个基于Spring框架的开源项目,旨在简化Spring应用程序的创建和部署。它通过自动配置和约定大于配置的原则,使得开发者能够快速构建独立、可运行的、生产级别的Spring应用程序。本文将对Spring Boot的源码进行解读,并…...
Python基础(二十四、JSON和pyecharts)
文章目录 一、JSON1.JSON介绍2.JSON格式数据转化3.示例 二、pyecharts1.安装pyecharts包2.查看官方示例 三、开发示例 一、JSON 1.JSON介绍 JSON是一种轻量级的数据交互格式,采用完全独立于编程语言的文本格式来存储和表示数据(就是字符串)…...
Java 并发之《深入理解 JVM》关于 volatile 累加示例的思考
在周志明老师的 《深入理解 JVM》一书中关于 volatile 关键字线程安全性有一个示例代码(代码有些许改动,语义一样): public class MyTest3 {private static volatile int race 0;private static void increase() {race;}public …...
GPM合并资料整理-GEM部分
一、性能数据上报项 1. CPU模块 上报键值说明采集平台cpu当前进程cpu使用率平均值Android & iOStotcpu系统cpu总使用率平均值Android & iOScpu_temp_maxcpu最高温度Androidcpu_temp_avgcpu温度平均值Androidgpu_temp_avggpu温度平均值Androidgpu_temp_maxgpu最高温度…...
STM32使用1.69寸液晶显示模块使用缓冲区实现快速刷新全屏显示字符串功能
一个1.69寸SPI接口的液晶显示模块,有320*24076800个点,每个点有2个字节表示RGB的颜色,所以需要153.6K个字节的数据来刷新全屏,如果SPI口输出数据不是高速并且不紧密排列的话,刷新就会比较慢,有从下到下的肉…...
SpringBoot AOP
依赖引入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>代码实现 以给公共字段注入值为例 公共字段与枚举类: private LocalDateTime createT…...
鉴源论坛 · 观模丨浅谈Web渗透之信息收集(下)
作者 | 林海文 上海控安可信软件创新研究院汽车网络安全组 版块 | 鉴源论坛 观模 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 信息收集在渗透测试过程中是最重要的一环,“浅谈web渗透之信息收集”将通过上下两篇,对信息收集、…...
构建自己的私人GPT-支持中文
上一篇已经讲解了如何构建自己的私人GPT,这一篇主要讲如何让GPT支持中文。 privateGPT 本地部署目前只支持基于llama.cpp 的 gguf格式模型,GGUF 是 llama.cpp 团队于 2023 年 8 月 21 日推出的一种新格式。它是 GGML 的替代品,llama.cpp 不再…...
php将文本内容写入一个文件(面向过程写法)
一、封装2个函数,读写文件 /*** desc 读取文件内容* param string $filename* return array*/ private function readContent(string $filename): array {$text file_get_contents($filename);if (!$text) {return [];}$result json_decode($text,true);return…...
SPDK As IPU Firmware
对于不熟悉术语Infrastructure Processing Unit (IPU, 基础设施处理器)的同学,IPU是PCIe形态的卡,连接到主机系统后可以卸载主机的“基础设施”工作。它通常是面向云服务商或者超融合服务提供商的。对于熟悉SPDK的开发人员来理解,这些卡通常具…...
快速删除node_modules文件夹
文章目录 快速删除node_modules文件夹PowerShell命令快速删除使用npm提供的命令删除node_modules 快速删除node_modules文件夹 前端开发过程中,经常会遇到npm操作问题,有时候不得不需要删除node_modules目录下所有的文件,然后重新npm install npm cache clean --force rm -rf…...
Mac安装nvm以及使用nvm安装node
1. 安装nvm命令 git clone https://gitee.com/mirrors/nvm.git ~/.nvm && cd ~/.nvm && git checkout git describe --abbrev0 --tags2. 配置环境变量 vi ~/.bash_profileexport NVM_DIR"$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] &&…...
vue element-ui的table列表中展示缩略图片效果实例
这篇文章主要给大家介绍了关于vue element-ui的table列表中展示多张图片(可放大)效果的相关资料,文中通过代码示例介绍的非常详细,需要的朋友可以参考下 一、效果图 二、代码部分 1、原理 使用 <el-table-column> 和 <el-image> 组件来在表格中插入缩略图 2、te…...
C/C++动态内存管理
文章目录 前言1.C/C内存分布2.C语言中动态内存管理方式:malloc/calloc/realloc/free3.C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. operator new与operator delete函数4.1 operator new与operator delete函数 5. new和delete的实现原…...
矩阵中的最长递增路径
题目链接 矩阵中的最长递增路径 题目描述 注意点 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕) 解答思路 因为最长递增路径一定是连续的,所以想到使用深度优先遍历来做。如果只使用深度优先遍历会导致超时(同一个…...
vue2 element 弹出框拖拽会出现一层阴影问题
问题如图所示: 因增加 draggable 属性导致我弹窗表单清空文本框时,从右向左选中字体会出现拖拽阴影效果 去掉 draggable 即可 <template><div class"sys-jobTrigger-container"><el-dialog:visible.sync"state.isShowD…...
idea git回滚之前提交记录
提交代码时,如果不小心提交了不需要提交的内容,在本地仓库中,此时需要回滚版本,如何回滚 1.打开git控制台,左下角git,选择要处理的分支,选择刷新获取最新git提交记录 2)选中自己commit需要回滚…...
什么是Modbus协议?
Modbus协议是一种在工业自动化领域广泛应用的通信协议,它允许不同设备之间进行可靠的数据交换和控制。该协议最初由Modicon公司于1979年创建,旨在提供一种简单而有效的方法,使PLC(可编程逻辑控制器)和其他自动化设备能…...
222.【2023年华为OD机试真题(C卷)】分配土地(扫描线算法-JavaPythonC++JS实现)
🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-分配土地二.解题思路三.题解代码Python题解代码…...
Linux网络编程(一-网络相关知识点)
目录 一、网络相关知识简介 二、网络协议的分层模型 2.1 OSI七层模型 2.2 TCP/IP五层模型 2.3 协议层报文间的封装与拆封 三、IP协议 3.1 MAC地址 3.2 IP地址 3.3 MAC地址与IP地址区别 一、网络相关知识简介 互联网通信的本质是数字通信,任何数字通信都离…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...
深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...
