Spring Boot 的启动原理、Spring Boot 自动配置原理
Spring Boot启动原理包含自动装配原理。
Spring Boot 的启动原理:
1. 入口类与 SpringApplication 初始化:
应用程序通常从一个带有 @SpringBootApplication 注解的主类开始,这个注解是一个组合注解,包含了 @SpringBootConfiguration, @EnableAutoConfiguration, 和 @ComponentScan。
主类中通过调用 SpringApplication.run(YourMainClass.class, args) 方法启动应用。
SpringApplication 初始化时,会加载外部配置(如application.properties或YAML)、初始化环境变量、加载自定义配置类等。
2. 加载自动配置:
@EnableAutoConfiguration 通过 SpringFactoriesLoader 加载所有 META-INF/spring.factories 中配置的 AutoConfigurationImportSelector 类。
AutoConfigurationImportSelector 会根据类路径上的jar和激活的profile来决定哪些自动配置类需要被加载。
3. 初始化 ApplicationContext:
SpringApplication 会创建并配置 ApplicationContext(通常是 AnnotationConfigApplicationContext),这个上下文是Spring容器的核心,负责管理Bean的生命周期。
期间会执行所有的 ApplicationListener 监听器的 onApplicationEvent 方法,以及所有注册的 SpringApplicationRunListener 的回调方法,如 starting()、environmentPrepared()、contextLoaded() 等。
4. Bean 定义与注册:
通过 @ComponentScan 扫描并注册应用中定义的组件(如 @Service, @Repository, @Controller 等)。
加载并处理 @Configuration 类中的 @Bean 方法,注册Bean定义。
自动配置类中定义的Bean也会在此阶段被注册到容器中。
5. Bean 实例化与依赖注入:
完成Bean定义的注册后,Spring容器会实例化这些Bean,并处理依赖注入,构建Bean之间的依赖关系。
6. 初始化完毕与启动完成:
应用上下文初始化完成后,会调用所有 CommandLineRunner 接口的实现类的 run 方法,以及 ApplicationRunner 的 run 方法,这是执行应用启动后任务的好时机。
最终,SpringApplication 的 run 方法完成,应用启动成功,等待处理HTTP请求或其他任务。
整个过程高度自动化,简化了传统Spring应用的配置工作,让开发者能更专注于业务逻辑的实现。
Spring Boot 自动配置原理
Spring Boot 的自动配置原理基于以下核心机制和组件:
1. 类路径扫描:Spring Boot 在应用启动时,会自动扫描应用类路径下的 jar 包,寻找包含 spring.factories 文件的 Spring Boot Starter 组件。这个文件列出了自动配置类以及其他初始化组件。
2. 自动配置类:这些自动配置类使用 @Configuration 注解标记,并通过条件注解如 @ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty 等来决定是否生效。这些条件注解基于类是否存在、特定的Bean是否已经定义、特定的属性值等条件来控制配置的启用。
3. 条件装配:根据应用上下文中的类和Bean的存在情况,以及配置属性的值,自动配置类中的配置逻辑会动态调整。如果检测到某个条件满足(例如,存在特定的类或设置了特定的属性),则相应的配置代码会被执行,从而向 Spring 容器注册Bean定义。
4. 用户自定义优先:自动配置遵循“用户配置优先”的原则。如果用户在自己的配置中显式定义了某个Bean(使用 @Bean 或 @Component 等),那么相同类型的自动配置Bean将不会被注册,确保了用户自定义配置的最高优先级。
5. 属性绑定:Spring Boot 支持自动绑定外部配置(如 application.properties 或 YAML 文件中的配置)到配置类的字段上,通过 @Value、@ConfigurationProperties 等注解实现,使得配置更加灵活和可外部化。
6. Starter POMs:Spring Boot 提供了一系列的 "Starter" 依赖,这些依赖本质上是一组 Maven POMs,它们导入了相关的库和自动配置模块,简化了项目的依赖管理。例如,加入 spring-boot-starter-web 会自动配置Tomcat、Spring MVC等组件。
综上所述,Spring Boot 的自动配置机制通过智能化的类路径扫描、条件化配置以及属性绑定等技术,大大简化了应用的配置过程,使得开发者能够快速启动和运行应用,同时保持高度的可定制性。
相关文章:
Spring Boot 的启动原理、Spring Boot 自动配置原理
Spring Boot启动原理包含自动装配原理。 Spring Boot 的启动原理: 1. 入口类与 SpringApplication 初始化: 应用程序通常从一个带有 SpringBootApplication 注解的主类开始,这个注解是一个组合注解,包含了 SpringBootConfigurat…...
不会开发的你也能管理好企业漏洞,开源免费工具:洞察(insight II)
公司刚开始建设安全管理时,都是从一片混沌开始的,资源总是不够的,我们每个做安全的人员,又要会渗透,又要抓制度,还得管理各种漏洞。在管理楼栋是,我相信大家都遇到过以下几个问题: …...
java实现两个不同对象的集合复制
场景: 我们开发中会遇到集合对象复制的场景,可以避免代码的重复编写 基于 com.alibaba.fastjson.JSON 实现对象集合的拷贝 对象定义:ObjectA属性:id,name,ageObjectB属性:id,name…...
bind failed: Address already in use
添加代码 这是个很常见的问题:在bind函数之前添加如下代码即可。 int yes 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) -1) { perror("setsockopt"); exit(1); } 查看端口 如果还是不能结果,那么说…...
LabVIEW结构体内部缺陷振动检测
结构体内部缺陷会改变其振动特性,通过振动分析可以检测并定位这些缺陷。本文详细分析内部缺陷对振动的影响,从频谱分析、时域分析和模态分析等多角度探讨基于LabVIEW的检测方法,提供实施步骤和注意事项,帮助工程师有效利用LabVIEW…...
RK3568技术笔记六 新建 Ubuntu Linux 虚拟机
VMware 安装完成后,启动 VMware 软件。启动后在 VMware 主界面点击“创建新的虚拟机”。如下图所示: 开始对新建的虚拟机进行设置。选择“自定义”,然后点击“下一步”。如下图所示: 使用默认配置,单击“下一步”。如下…...
Web前端博客模板下载:一站式解决方案与深度探索
Web前端博客模板下载:一站式解决方案与深度探索 在当今数字化时代,拥有一个美观且功能强大的博客网站已成为许多人的追求。而Web前端博客模板作为构建博客网站的重要工具,其选择和下载对于实现这一目标至关重要。本文将从四个方面、五个方面…...
Docker部署常见应用之大数据实时计算引擎Flink
文章目录 Flink 简介Docker 部署Docker Compose 部署参考文章 Flink 简介 Apache Flink 是一个开源的分布式流批一体化的计算框架,它提供了一个流计算引擎,能够处理有界和无界的数据流。Flink 的核心优势在于其高吞吐量、低延迟的处理能力,以…...
python使用os.getcwd()获取当前路径不正确
# codinggbk import ostry:current_dir os.getcwd()#print(os.path.dirname(os.path.realpath(__file__)))#获取错误print("当前工作目录[不想要]:",current_dir)#获取真实文件夹路径print("当前工作目录[想要]:",os.path.dirname(…...
pycharm终端pip安装模块成功但还是显示找不到 ModuleNotFoundError: No module named
报错信息: ModuleNotFoundError: No module named 但是分明已经安装过此模块: 在cmd运行pip list 查看所有安装过的包找到了安装过: 如果重新安装就是这样:显示已经存在了 问题排查: 直接根据重新安装的显示已存在的…...
iptables教程
1 iptables安装 1.1 iptables和iptables-service的关系 iptables 是基于内核的,和 iptables-services 没有关系,不用安装任何工具包就可以使用 iptable 命令添加的防火墙规则, 但是iptables添加的规则是临时的,基于内存的&…...
破局外贸企业海外通邮难题,U-Mail邮件中继有绝招
在当今全球化的商业环境中,国内企业正扮演着越来越重要的角色,它们不仅在国内市场活跃,而且在全球范围内拓展业务,成为国际贸易中不可或缺的一部分。然而,尽管这些企业在业务扩展上取得了显著成就,但在与海…...
支持向量机(SVM): 从理论到实践的指南(2)
葡萄酒数据集经常被用于机器学习、模式识别和统计分类算法的测试中。由于其特征维度较高,非常适合于验证特征选择和降维方法,例如主成分分析(PCA)或线性判别分析(LDA)的效果。同时,由于数据集包…...
PDF格式分析(八十六)——修订注释(Redaction)
修订注释(PDF 1.7及其以上版本),该注释的做用是标识要从文档中删除的内容。 修订注释启用的步骤如下: 1、内容标识。PDF编辑器可指定应删除的文档内容片段或区域,在执行下一个步骤前,用户可以看到、移动和重新定义这些注释。 2、内容移除。PDF阅读器应删除修订注释指…...
【python】flask中Session忽然取不到存储内容怎么办?
尚未确定,后续更新,先别以此为准。 【背景】 用flask写的Web应用,运行不正常,查看原因,发现视图函数a中设定的session内容在视图函数b忽然拿不到了。 【分析】 这个应用在两个服务器间互相Hook,因此可能涉及跨域的问题。 视图函数a设置的session,再次从前端调用视图…...
05-腾讯云Copilot及 向量数据库AI套件介绍
1 Andon Copilot核心功能介绍 2 Andon Copilot覆盖腾讯云售后、售前场景 3 腾讯云向量数据库– AI套件效果 AI 套件是腾讯云向量数据库(Tencent Cloud VectorDB)提供的一站式文档检索解决方案,包含自动化文档解析、信息补充、向量化、内容检…...
软件版本库管理工具
0 Preface/Foreword 常用代码版本管理工具包括如下几种: Git,最基本管理工具,由Linux kernel开发者开发Repo,主要用于管理Android SDK,由Google开发Gerrit,代码审查软件 1 Git 最基本的代码版本库管理工…...
LVS负载均衡集群企业级应用实战-LVS/NAT模式(三)
目录 LVS/NAT模式 一. 环境准备 二. 对虚拟服务器操作 三. 对真实服务器操作 四. 打开网站验证 LVS/NAT模式 一. 环境准备 统一关闭防火墙和selinux,时间同步,配置好YUM源系统发行版选择会用就可以,这里也是两种一起使用学习。用的不同系…...
在Spring中如何手动开启事务(使用编程式事务)
这里写自定义目录标题 一、使用 transactionManager1、向容器中注入事务管理器2、使用 transactionManager 提交事务3、测试 二、使用TransactionTemplate1、向容器中注入 TransactionTemplate2、开启事务 一、使用 transactionManager 1、向容器中注入事务管理器 Configurat…...
cv的优势
计算机视觉(CV)技术是一种通过计算机对图像、视频等视觉数据进行分析和理解的技术。它在多个领域有着广泛的应用,包括图像识别、目标检测、人脸识别、无人驾驶等。下面是一些计算机视觉技术的优势和挑战的例子: 优势:…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
