SpringBoot-SpringBoot源码解读
SpringBoot-SpringBoot源码解读
一、Spring Boot启动过程概述
Spring Boot通过一系列的类和机制,简化了Spring应用的启动流程。当你执行SpringApplication.run()时,Spring Boot会自动完成应用的初始化、环境配置、组件加载、自动配置等任务,最终启动嵌入式Web服务器或其他应用容器。
1、Spring Boot的启动流程
Spring Boot的启动过程可以大致分为以下几个步骤:
-
创建SpringApplication实例: Spring Boot的启动入口通常是调用SpringApplication.run()方法,这时会创建一个SpringApplication实例。
-
设置应用上下文: Spring Boot会根据项目类型选择合适的应用上下文。对于Web应用,Spring Boot会选择AnnotationConfigServletWebApplicationContext,对于非Web应用,Spring Boot则使用AnnotationConfigApplicationContext。
-
设置环境: 在启动过程中,Spring Boot会创建并设置一个Environment对象,加载默认的环境配置、命令行参数和application.properties等配置文件。
-
加载自动配置: Spring Boot会根据项目中的依赖和spring.factories文件自动加载所需的配置。例如,如果项目中包含Spring Web模块,Spring Boot会自动配置Tomcat容器。
-
初始化容器和Bean: Spring Boot会初始化所有的Bean,自动注入依赖,完成应用的初始化工作。
-
启动嵌入式服务器: 对于Web应用,Spring Boot会启动嵌入式的Web服务器(如Tomcat、Jetty等),并开始接受HTTP请求。
-
应用运行: 当所有初始化工作完成后,应用开始运行,处理业务请求。
2、关键类解析
在Spring Boot启动过程中,以下几个类扮演着至关重要的角色:
- SpringApplication:负责应用的启动和初始化。
- ConfigurableApplicationContext:负责管理应用的上下文。
- AnnotationConfigApplicationContext:作为容器,加载应用的Bean。
- ApplicationContextInitializer:用于在应用上下文初始化之前执行自定义逻辑。
我们通过源代码来理解Spring Boot启动的核心过程。
SpringApplication的run()方法解析:
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {SpringApplication application = new SpringApplication(primarySource);application.setApplicationContextClass(GenericWebApplicationContext.class);return application.run(args);
}
在此方法中,Spring Boot会创建一个SpringApplication对象,并通过run()方法启动应用。primarySource参数通常是应用的主配置类或启动类,args是命令行传递的参数。接下来,我们将详细分析run()方法的实现。
二、SpringApplication类源码解读
1、SpringApplication类的作用
SpringApplication是Spring Boot应用启动的核心类。它负责启动Spring容器,管理应用的生命周期,并处理应用的配置、环境和自动化设置。该类封装了Spring应用初始化的多个步骤,是Spring Boot应用程序的核心入口。
2、run()方法深入分析
run()方法是Spring Boot应用启动的入口,它的作用不仅仅是启动应用,它还包含了一系列复杂的操作,包括环境的初始化、应用上下文的配置等。
run()方法解析:
public ConfigurableApplicationContext run(String... args) {// 1. 环境准备prepareEnvironment(args);// 2. 初始化Spring应用上下文ConfigurableApplicationContext context = createApplicationContext();// 3. 初始化应用的BeanprepareContext(context, args);// 4. 启动监听器并发布应用事件refreshContext(context);// 5. 完成应用启动return context;
}
- 准备环境:prepareEnvironment()方法会根据传入的参数设置应用环境,例如加载配置文件、命令行参数等。
- 创建应用上下文:根据项目类型,选择合适的ApplicationContext(例如Web应用会选择AnnotationConfigServletWebApplicationContext)。
- 初始化容器:prepareContext()方法会初始化应用上下文,将所有的Bean注册到容器中,并执行一些必要的初始化操作。
- 启动监听器并发布应用事件:refreshContext()会刷新容器并发布事件,启动所有的Bean。
3、事件监听与应用上下文的启动
Spring Boot在启动过程中会广播多个事件,如ApplicationStartingEvent、ApplicationPreparedEvent、ApplicationReadyEvent等,开发者可以通过监听这些事件来执行特定操作。例如,监听ApplicationReadyEvent事件,可以在应用完全启动后执行初始化任务。
三、Spring Boot的自动配置实现
1、自动配置的概念
自动配置是Spring Boot的一大亮点。通过@EnableAutoConfiguration注解,Spring Boot可以自动推断和配置项目中所需的组件,从而大大减少开发者的配置工作。自动配置基于“约定大于配置”的原则,自动加载相关的配置并根据项目依赖进行调整。
2、自动配置的工作原理
自动配置的实现基于@Configuration注解的类,并通过@Conditional注解对自动配置进行条件化。Spring Boot会根据应用的类路径和环境条件,自动选择合适的配置类。
自动配置类示例:
@Configuration
@ConditionalOnClass(JdbcTemplate.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {@Beanpublic DataSource dataSource(DataSourceProperties properties) {return new DriverManagerDataSource(properties.getUrl(), properties.getUsername(), properties.getPassword());}
}
在上面的例子中,@ConditionalOnClass(JdbcTemplate.class)表示只有在类路径中包含JdbcTemplate时才会加载此自动配置类。Spring Boot通过这种方式控制自动配置的启用条件。
3、自动配置实现的关键代码分析
Spring Boot通过META-INF/spring.factories文件加载自动配置类。这个文件包含了自动配置类的名称和启动条件,Spring Boot会扫描并自动加载这些配置。
spring.factories文件示例:
# META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
这些配置项会告诉Spring Boot在启动时自动加载相关的自动配置类。
四、配置和属性加载的原理
1、配置文件的加载过程
Spring Boot的配置文件(如application.properties或application.yml)可以存放在不同的路径中,如src/main/resources。Spring Boot会在应用启动时加载这些配置文件,并将其中的属性注入到Spring容器中。
加载顺序:
- 默认配置:Spring Boot提供了一些默认配置,位于spring-boot-autoconfigure模块中。
- 环境属性:通过Environment接口,Spring Boot加载并管理来自不同位置的属性。
- 外部配置文件:如果应用有外部配置文件,Spring Boot会优先加载这些配置文件中的属性。
2、属性源的管理
Spring Boot使用PropertySource来管理应用的属性源。Spring Boot提供了多个属性源,包括application.properties、命令行参数、JVM参数、操作系统环境变量等。Spring Boot会根据优先级将这些属性源合并到Environment对象中。
属性源合并过程:
@PropertySource("classpath:application.properties")
public class MyApplication {@Value("${app.name}")private String appName;
}
3、配置文件与环境的结合
Spring Boot通过@ConfigurationProperties注解将配置文件中的属性与Java对象结合。开发者可以通过这种方式将配置文件中的复杂配置映射到POJO类中。
配置文件与Java类映射示例:
@ConfigurationProperties(prefix = "app")
public class AppConfig {private String name;private String version;// getters and setters
}
总结
通过对Spring Boot启动过程、SpringApplication类、自动配置及属性加载原理的深入解析,我们不仅能了解Spring Boot的启动机制,还能够掌握如何优化应用的启动流程与配置管理。这些原理和源码的深入解析将帮助开发者更好地理解Spring Boot的设计思想,提升代码的可维护性和性能。
以上是 SpringBoot-SpringBoot源码解读 的学习
相关文章:
SpringBoot-SpringBoot源码解读
SpringBoot-SpringBoot源码解读 一、Spring Boot启动过程概述 Spring Boot通过一系列的类和机制,简化了Spring应用的启动流程。当你执行SpringApplication.run()时,Spring Boot会自动完成应用的初始化、环境配置、组件加载、自动配置等任务,…...

CAD如何导出PDF?PDF如何转CAD?详细教程来了
浩辰CAD看图王是一款功能强大的CAD图纸查看与编辑工具,其核心功能之一便是支持CAD与PDF格式的互转。下面是CAD看图王输出PDF和PDF转CAD功能的详细介绍及操作步骤: 一、输出PDF功能 看图王可以将CAD图纸转换为PDF格式,是文件在不同的设备上显…...

python-数据可视化(大数据、数据分析、可视化图像、HTML页面)
通过 Python 读取 XLS 、CSV文件中的数据,对数据进行处理,然后生成包含柱状图、扇形图和折线图的 HTML 报告。这个方案使用了 pandas 处理数据,matplotlib 生成图表,并将图表嵌入到 HTML 页面中。 1.XSL文件生成可视化图像、生成h…...
el-select中自定义 两组el-option,但是key不一样,并且点击需获取当前整个项的所有属性
当el-select中只有一组el-option , 获取点击的当前项的属性 , el-select 绑定:value-keyid 但是 当el-select中有两组el-option ,每组option的key不一致,如下代码所示 <el-selectv-model"sth" change"choosee":value-key"…...

【笔记】OpenCV的学习(未完)
由于只记关键和不懂的部分 希望做到下次再看这部分笔记就记得 所以用词会非常简练 前向传播 输入数据依次经过模型的各层,按照各层定义的运算规则进行计算,最终得到模型预测输出的过程。 单向的信息流动,不涉及模型参数的更新。 助于思考的…...

多模态大语言模型arxiv论文略读(八十七)
MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ➡️ 论文标题:MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ➡️ 论文作者:Xiangyu Zhao, Xiangtai Li, Haodong Duan, Haian Huang, Yining Li, Kai Chen, Hua Ya…...
《棒球百科》长寿运动排名·棒球1号位
关于长寿运动的排名,运动长寿秘诀: 一、全球公认的「长寿运动」排名 游泳(低冲击、强化心肺) 快走/健走(每日30分钟降低15%早逝风险) 太极拳(平衡力减压,哈佛研究称可延缓衰老&am…...
Maven 项目打包时添加本地 Jar 包
在 Maven 项目开发中,我们经常会遇到需要引入本地 Jar 包的场景,比如使用未发布到中央仓库的第三方库、公司内部自定义工具包,或者处理版本冲突的依赖项。本文将详细介绍如何通过 Maven 命令将本地 Jar 包安装到本地仓库,并在项目…...

记录将网站从http升级https
http与https 你知道http是什么吗,那你知道https吗?在进行升级之前我们应该都听说http不安全,要用https,那你知道这是为什么吗? 什么是http? HTTP 是超文本传输协议,也就是HyperText Transfer…...
如何利用 ORM 框架有效防范 SQL 注入攻击
如何利用 ORM 框架有效防范 SQL 注入攻击 1. 引言 在现代 Web 开发中,SQL 注入攻击始终是数据库安全的一大隐患。攻击者利用不安全的 SQL 语句执行恶意操作,可能导致数据库泄露、篡改甚至被完全控制。幸运的是,ORM(对象关系映射)框架为开发者提供了一种更安全、更高效的…...
spark-shuffle 类型及其对比
1. Hash Shuffle 原理:将数据按照分区键进行哈希计算,将相同哈希值的数据发送到同一个Reducer中。特点:实现简单,适用于数据分布均匀的场景。但在数据分布不均匀时,容易导致某些Reducer处理的数据量过大,产…...

免费PDF工具-PDF24V9.16.0【win7专用版】
【百度】https://pan.baidu.com/s/1H7kvHudG5JTfxHg-eu2grA?pwd8euh 提取码: 8euh 【夸克】https://pan.quark.cn/s/92080b2e1f4c 【123】https://www.123912.com/s/0yvtTd-XAHjv https://creator.pdf24.org/listVersions.php...
游戏开发实战(二):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
文章目录 奇美拉和队列奇美拉被动技能多对多观察者关系实现自定义元类奇美拉基类 管理奇美拉的队列奇美拉队列类心得体会扩展 规则定义工作相关奇美拉相关 奇美拉属性 在本篇博文,我将介绍本项目的整体框架,以及“编码规则”,这些规则保证了本…...
人工智能发展
探秘人工智能领域的热门编程语言与关键知识 在当今科技飞速发展的时代,人工智能已渗透到生活的各个角落,从智能语音助手到精准的推荐系统,从自动驾驶汽车到医疗影像诊断,人工智能正以前所未有的速度改变着世界。而在这背后&#x…...
在Rockchip平台上利用FFmpeg实现硬件解码与缩放并导出Python接口
在Rockchip平台上利用FFmpeg实现硬件解码与缩放并导出Python接口 一、为什么需要硬件加速?二、[RK3588 Opencv-ffmpeg-rkmpp-rkrga编译与测试](https://hi20240217.blog.csdn.net/article/details/148177158)三、核心代码解释3.1 初始化硬件上下文3.2 配置解码器3.3 构建滤镜链…...
Flink集成资源管理器
Flink集成资源管理器 Apache Flink 支持多种资源管理器,主要包括以下几种: YARN ResourceManager :适用于使用 Hadoop YARN 作为资源管理器的环境。YARN ResourceManager 负责管理集群中的资源,包括 CPU、内存等,并…...

一周学会Pandas2 Python数据处理与分析-Pandas2数据合并与对比-pd.concat():轴向拼接
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在数据分析中,数据往往分散在多个来源(如不同文件、数据库表或API),需…...

安卓原生兼容服务器
安卓原生兼容服务器的定义 安卓原生兼容服务器指基于Android系统内核和服务框架构建的服务器环境,能够在不依赖第三方适配层的情况下,直接运行符合Android API规范的服务程序,并满足与其他软硬件组件的协同工作需求。其核心特征体现在以下…...

优化用户体验:拦截浏览器前进后退、刷新、关闭、路由跳转等用户行为并弹窗提示
🧑💻 写在开头 点赞 收藏 学会🤣🤣🤣 需求 首先列举一下需要拦截的行为,接下来我们逐个实现。 浏览器前进后退标签页刷新和关闭路由跳转 1、拦截浏览器前进后退 这里的实现是核心,涉及到大…...
横川机器人驱动器导入参数教程
连接端口:有分220v和380v(刷新多次无效果就重新打开软件)升级固件:区分低压版和高压版导入参数:下载参数,下载成功后必须软重启,重新连接确认电机无干涉后相序测试 (等待10s&#x…...

大学生创新创业项目管理系统设计——数据库实验九
本实验为自己设计完成,我当年数据库实验得了94分 目录 1.实验目的 2.实验内容和要求 3.实验步骤 4.实验心得 实验九 数据库设计 1.实验目的 掌握数据库设计的过程和方法。 2.实验内容和要求 (35)大学生创新创业项目管理系统设计 一…...

电磁场与电场、磁场的关系
电磁场与电场、磁场之间存在着深刻的内在联系和统一性关系。这三者共同构成了电磁相互作用的基本框架,是理解电磁现象的关键所在。 电场和磁场实际上是电磁场的两个不同表现形式,它们既相互区别又密切联系。电场主要由静止电荷产生,表现为对…...

Python爬虫实战:研究Newspaper框架相关技术
1. 引言 1.1 研究背景与意义 互联网的快速发展使得新闻信息呈现爆炸式增长,如何高效地获取和分析这些新闻数据成为研究热点。新闻爬虫作为一种自动获取网页内容的技术工具,能够帮助用户从海量的互联网信息中提取有价值的新闻内容。本文基于 Python 的 …...

Kotlin MultiPlatform 跨平台版本的记账 App
前言 一刻记账 KMP (Kotlin MultiPlatform) 跨平台版本今天终于把 Android 和 iOS 进度拉齐了. 之前只有纯 Android 的版本. 最近大半年有空就在迁移代码到 KMP 上 中间学了 iOS 基础知识. xcode 的使用. 跨平台的架构的搭建… 感觉经历了很多很多. 一把辛酸泪 迁移的心路历…...

PIO 中的赋值魔术,MOV 指令
前言 在普通编程语言中,mov 可以理解为“赋值指令”,将一个值从一个地方拷贝到另一个地方。在 RP2040 的 PIO 汇编语言中,mov 同样是数据传递的关键指令,但它操作的是 PIO 独有的几个寄存器。 在 PIO 中,你可以用 mov …...
[docker]更新容器中镜像版本
从peccore-dev仓库拉取镜像 docker pull 10.12.135.238:8060/peccore-dev/configserver:v1.13.45如果报错,请参考docker拉取镜像失败,添加仓库地址 修改/etc/CET/Common/peccore-docker-compose.yml文件中容器的版本,为刚刚拉取的版本 # 配置中心confi…...

第十七次CCF-CSP算法(含C++源码)
第十七次CCF-CSP认证 小明种苹果AC代码 小明种苹果(续)AC代码 后面好难哈哈 小手冰凉 小明种苹果 输入输出: 题目链接 AC代码 #include<iostream> using namespace std; int n,m; int res,res3; int sum; int res21; int main(){cin …...

打造一个支持MySQL查询的MCP同步插件:Java实现
打造一个支持MySQL查询的MCP同步插件:Java实现 用Java实现一个MCP本地插件,直接通过JDBC操作本地MySQL,并通过STDIO与上层MCP客户端(例如Cursor)通信。插件注册一个名为mysql 的同步工具,接收连接参数及SQL…...

黑马k8s(十五)
1.Ingress介绍 2.Ingress使用 环境准备 Http代理 Https代理...
Axure项目实战:智慧运输平台后台管理端-订单管理1(多级交互)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:订单管理 主要内容:条件组合、中继器筛选、表单跟随菜单拖动、审批数据互通等 应用场景…...