当前位置: 首页 > news >正文

Spring Boot——Spring Boot自动配置原理

系列文章目录

Spring Boot启动原理


Spring Boot自动配置原理

  • 系列文章目录
  • 前言
  • 一、Spring Boot自动配置原理剖析
  • 二、自动配置生效
  • 三、总结:


前言

一直在使用Spring Boot特别好奇的是为什么Spring Boot比Spring在项目构建和开发过程中要方便很多,无需编写大量的配置,Spring Boot自动给你配置好了。往往是集成项目依赖之后一键使用。于是小编我就学习和研究了一下Spring Boot的自动配置。


一、Spring Boot自动配置原理剖析

主程序入口示例

@SpringBootApplication
public class SampleWebJspApplication extends SpringBootServletInitializer {public static void main(String[] args) {SpringApplication.run(SampleWebJspApplication.class, args);}
}

我们可以发现在Spring Boot项目的启动类上有一个@SpringBootApplication,而这个注解与Spring Boot的自动装配有关系。我进入这个注解可以发现:
在这里插入图片描述
通过上面的图片我们可以看出,@SpringBootApplication又是主要由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan这三个注解组成。

@SpringBootConfiguration表示这是一个 Spring Boot 应用程序的配置类。
@ComponentScan用于配置 Spring 的组件扫描。它会告诉 Spring 在指定的包下扫描组件,并将它们注册为 Spring 的 Bean。

重点是这个@EnableAutoConfiguration注解:
而**@EnableAutoConfiguration**的含义就是开启自动配置。该注解启用了 Spring Boot 的自动配置机制,它告诉 Spring Boot 根据项目的依赖和类路径中的配置来自动配置应用程序。

我们再进入到@EnableAutoConfiguration注解中,我们可以看到:

在这里插入图片描述

我上面图片中我们可以看出,@EnableAutoConfiguration主要由@AutoConfigurationPackage、@Import这两个注解组成。

@AutoConfigurationPackage被应用在 Spring Boot 主配置类上时,它会扫描该主配置类所在的包及其子包,并将其作为自动配置的起始位置。之前的@SpringBootConfiguration标注了主配置类。最终作用在了SampleWebJspApplication类上,也就是启动类上。

其中最为关键的是**@Import这个注解,@Import 的参数会指定一系列自动配置类的类名,这些类会被导入到 Spring Boot 应用的上下文中。细节上是:
其导入的AutoConfigurationImportSelector类的
selectImports()**方法中最终通过
**SpringFactoriesLoader.loadFactoryNames()**方法从类路径下的META-INF/spring.factories中获取key键为EnableAutoConfiguration类的全类名对应的value值,value值是一个xxxAutoConfiguration的全类名的列表。

如图:
在这里插入图片描述
拿到这些自动配置类的全类名的列表之后,然后会将其加载到Spring容器中,当然判断我们项目中引入了那些启动器

例如引入了spring-boot-starter-web那么就会将org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.web.embedded.EmbeddedServletContainerAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
等等…加载到Spring容器中。

补充什么是启动器:启动器也叫起步依赖,起步依赖是一组预定义的依赖项,他们封装了对特定功能集所需的所有依赖和配置,让开发者能够更快得集成常见功能,而无需手动添加每一个依赖。
起步依赖的命名遵循一定的规则,通常以spring-boot-starter为前缀,后面跟着起步依赖的类型或用途。
如:
spring-boot-starter-web:用于开发web应用程序的起步依赖,包含了Web相关的依赖和配置,如Tomact、Spring Web MVC等
spring-boot-starter-data-jpa:用于与JPA集成的起步依赖,包含了JPA、Hibernate等依赖。

二、自动配置生效

每一个XxxxAutoConfiguration自动配置类,在某些条件下才会生效。这些条件在Spring Boot中以注解的形式体现。
这些条件注解主要位于org.springframework.boot.autoconfigure.condition 包下。
常见的条件注解有:

@ConditionalOnClass:
当类路径中存在指定的类时,自动配置类才会生效
@ConditionalOnMissingClass:
当类路径中不存在指定的类时,自动配置类才会生效。
@ConditionalOnBean:
当 Spring 容器中存在指定的 Bean 时,自动配置类才会生效。
@ConditionalOnMissingBean:
当 Spring 容器中不存在指定的 Bean 时,自动配置类才会生效。
@ConditionalOnProperty:
当指定的配置属性存在且为指定的值时,自动配置类才会生效。
@ConditionalOnWebApplication:
当应用是一个 Web 应用程序时,自动配置类才会生效。
@ConditionalOnNotWebApplication:
当应用不是一个 Web 应用程序时,自动配置类才会生效。
这些条件注解可以很灵活地根据不同的条件来决定是否启用自动配置类,从而实现按需加载配置,避免了配置的冗余和不必要的加载。

补充:对于具体的Spring Boot启动流程,可以浏览下面的文章:Spring Boot——Spring Boot启动原理

三、总结:

在 Spring Boot 应用程序启动过程中会通过@EnableAutoConfiguration 注解找到 META-INF/spring.factories 配置文件中的所有自动配置类,并将它们加载到应用程序上下文中,以实现自动配置的功能。

**通过这一次对Spring Boot自动配置的探究让我清晰了为什么Spring Boot能引入启动依赖(starter)之后不需要手动配置了。**对于Spring Boot的了解也更近了一步。

相关文章:

Spring Boot——Spring Boot自动配置原理

系列文章目录 Spring Boot启动原理 Spring Boot自动配置原理 系列文章目录前言一、Spring Boot自动配置原理剖析二、自动配置生效三、总结: 前言 一直在使用Spring Boot特别好奇的是为什么Spring Boot比Spring在项目构建和开发过程中要方便很多,无需编…...

深度学习:Pytorch最全面学习率调整策略lr_scheduler

深度学习:Pytorch最全面学习率调整策略lr_scheduler lr_scheduler.LambdaLRlr_scheduler.MultiplicativeLRlr_scheduler.StepLRlr_scheduler.MultiStepLRlr_scheduler.ConstantLRlr_scheduler.LinearLRlr_scheduler.ExponentialLRlr_scheduler.PolynomialLRlr_sched…...

【uniapp】更改富文本编辑器图片大小

代码块 //<view v-html"productDetails"></view><rich-text :nodes"productDetails"></rich-text>// 假设htmlContent字段是后台返回的富文本字段var htmlContent res.result.productDetailsconst regex new RegExp(<img, gi…...

数据结构和算法一(空间复杂度、时间复杂度等算法入门)

时间复杂度&#xff1a; 空间复杂度&#xff1a; 时间比空间重要 递归&#xff1a; 递归特征&#xff1a; 递归案例&#xff1a; 汉诺塔问题&#xff1a; def hanoi(n,A,B,C):if n>0:hanoi(n-1,A,C,B)print("moving from %s to %s"%(A,C))hanoi(n-1,B,A,C)hanoi…...

Pytorch深度学习-----神经网络的基本骨架-nn.Module的使用

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…...

QT开发快捷键

QT开发快捷键 alt enter // 自动创建类的定义 Ctrl / 注释当前行 或者选中的区域 Ctrl R 运行程序 Ctrl B Build 项目 CtrlShiftF 查找内容 F5 开始调试 ShiftF5 停止调试 F9 设置和取消断点 F10 单步前进 F11 单步进入函数 Shift F11 单步跳出函数 F1 // 查看帮助&#…...

RabbitMQ 教程 | RabbitMQ 入门

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…...

【雕爷学编程】MicroPython动手做(10)——零基础学MaixPy之神经网络KPU2

KPU的基础架构 让我们回顾下经典神经网络的基础运算操作&#xff1a; 卷积&#xff08;Convolution&#xff09;:1x1卷积&#xff0c;3x3卷积&#xff0c;5x5及更高的卷积 批归一化&#xff08;Batch Normalization&#xff09; 激活&#xff08;Activate&#xff09; 池化&…...

BUG分析以及BUG定位

一般来说bug大多数存在于3个模块&#xff1a; 1、前台界面&#xff0c;包括界面的显示&#xff0c;兼容性&#xff0c;数据提交的判断&#xff0c;页面的跳转等等&#xff0c;这些bug基本都是一眼可见的&#xff0c;不太需要定位&#xff0c;当然也不排除一些特殊情况&#xf…...

Day46 算法记录| 动态规划 13(子序列)

这里写目录标题 300.最长递增子序列 674. 最长连续递增序列718. 最长重复子数组 300.最长递增子序列 视频解析&#xff1a; 第一层for循环遍历每一个元素&#xff0c; ------- 第二层for循环找到当前元素前面有几个小于该值的元素 结尾需要统计最多的个数 class Solution {pu…...

结构型-桥接模式(Bridge Pattern)

概述 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;将抽象部分和实现部分分离&#xff0c;使它们可以独立地变化。桥接模式通过将继承关系转化为关联关系&#xff0c;将抽象部分和实现部分分离开来&#xff0c;从而使它们可以独立地变化。…...

基于小波哈尔法(WHM)的一维非线性IVP测试问题的求解(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 小波哈尔法&#xff08;WHM&#xff09;是一种求解一维非线性初值问题&#xff08;IVP&#xff09;的数值方法。它基于小波分析的思想&#xf…...

前端(Electron Nodejs)如何读取本地配置文件

使用electron封装了前端界面之后&#xff0c;最终打包为一个客户端&#xff08;exe&#xff09;。但是&#xff0c;最近项目组内做CS&#xff08;c开发&#xff09;的&#xff0c;想把所有的配置都放进安装目录的配置文件中&#xff08;比如config.json&#xff09;。这做法&am…...

没有 telnet 不能测试端口?容器化部署最佳的端口测试方式

写在前面 生产中遇到&#xff0c;整理笔记在容器中没有 telnet &#xff0c;如何测试远程端口理解不足小伙伴帮忙指正 他的一生告诉我们&#xff0c;不能自爱就不能爱人&#xff0c;憎恨自己也必憎恨他人&#xff0c;最后也会像可恶的自私一样&#xff0c;使人变得极度孤独和悲…...

漏洞发现-BurpSuite插件-Fiora+Fastjson+Shiro

BurpSuite插件安装 插件&#xff1a;Fiora Fiora是LoL中的无双剑姬的名字&#xff0c;她善于发现对手防守弱点&#xff0c;实现精准打击。该项目为PoC框架nuclei提供图形界面&#xff0c;实现快速搜索、一键运行等功能&#xff0c;提升nuclei的使用体验。 该程序即可作为burp插…...

Elasticsearch-倒排索引

Elasticsearch和Lucene的关系 Lucene 是一个开源、免费、高性能、纯 Java 编写的全文检索引擎&#xff0c;可以算作是开源领域最好的全文检索工具包。ElasticSearch 是基于Lucene实现的一个分布式、可扩展、近实时性的高性能搜索与数据分析引擎。 Lucene索引层次结构 Lucene的…...

pagehelper与mybatis-plus冲突的解决办法

背景&#xff1a; springcloud项目开发新功能时因想使用mybatis-plus&#xff0c;原有功能只使用了mybatis&#xff0c;但在开发时发现某个公共模块使用了com.github.pagehelper&#xff0c;且很多模块都集成了该模块依赖&#xff08;为了保证原有功能不发生问题&#xff0c;…...

解决使用Timer时出现Task already scheduled or cancelled异常的问题

在使用java.util.Timer和java.util.TimerTask执行定时任务时&#xff0c;如果在调用Timer的schedule或scheduleAtFixedRate方法时&#xff0c;报错如下&#xff1a; java.lang.IllegalStateException: Task already scheduled or cancelled 说明当前Timer对象已经执行结束或被取…...

P1175 后缀表达式

题意 传送门 P1175 表达式的转换 题解 编码运算符的优先级&#xff0c;线性复杂度将中缀表达式转换为后缀表达式。为了方便输出&#xff0c;可以用类似对顶栈的结构&#xff0c;初始时右侧栈为后缀表达式&#xff1b;对于每一步计算&#xff0c;右侧栈不断弹出数字到左侧栈&…...

【HashMap】49. 字母异位词分组

49. 字母异位词分组 解题思路 创建一个哈希容器 key是每一个字母异位词 排序之后的词 List是所有的字母异位词因为所有的字母异位词排序之后的结果都是一样的增强for循环遍历字符串数组将每一个字符串转换为字符数组因为字母异位词排序之后 都是一样的将排序之后的字符数组 转…...

革新性STL文件管理工具:让3D模型预览效率提升80%的Windows解决方案

革新性STL文件管理工具&#xff1a;让3D模型预览效率提升80%的Windows解决方案 【免费下载链接】STL-thumbnail Shellextension for Windows File Explorer to show STL thumbnails 项目地址: https://gitcode.com/gh_mirrors/st/STL-thumbnail 问题发现&#xff1a;3D设…...

快速验证机器人抓取逻辑:用快马平台十分钟搭建openclaw仿真原型

最近在研究机器人抓取相关的技术&#xff0c;发现openclaw这个开源框架挺有意思的。不过搭建完整的仿真环境需要配置不少东西&#xff0c;对于快速验证想法来说有点麻烦。于是尝试用InsCode(快马)平台来快速搭建原型&#xff0c;没想到十分钟就搞定了基础功能&#xff0c;分享一…...

一键部署+可视化训练:Llama Factory让大模型定制如此简单

一键部署可视化训练&#xff1a;Llama Factory让大模型定制如此简单 1. 为什么选择Llama Factory&#xff1f; 大模型微调一直是AI开发者面临的技术挑战之一。传统方法需要编写大量代码、处理复杂的环境配置&#xff0c;并且对硬件资源要求极高。Llama Factory的出现彻底改变…...

BetterNCM Installer:5分钟极速安装网易云音乐插件的终极指南

BetterNCM Installer&#xff1a;5分钟极速安装网易云音乐插件的终极指南 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件安装的繁琐步骤而头疼吗&#xff1f;Bet…...

实战应用:基于快马平台开发企业内网服务可用性监控系统

今天想和大家分享一个最近用InsCode(快马)平台快速实现的实用项目——企业内网服务可用性监控系统。这个需求来源于我们公司内部的实际痛点&#xff1a;随着服务器数量增加&#xff0c;经常出现某个服务端口异常但没人及时发现的情况。 1. 项目背景与需求分析 我们公司有几十…...

gInk:重新定义屏幕标注体验的轻量化协作工具

gInk&#xff1a;重新定义屏幕标注体验的轻量化协作工具 【免费下载链接】gInk An easy to use on-screen annotation software inspired by Epic Pen. 项目地址: https://gitcode.com/gh_mirrors/gi/gInk 远程会议中&#xff0c;当产品经理试图在共享屏幕上圈出设计稿的…...

m4s-converter:让B站缓存重获新生的轻量级格式转换工具

m4s-converter&#xff1a;让B站缓存重获新生的轻量级格式转换工具 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 当你辛苦缓存的B站视频因下架…...

Qwen3-14B私有部署商业应用:替代SaaS服务降本提效的真实测算

Qwen3-14B私有部署商业应用&#xff1a;替代SaaS服务降本提效的真实测算 1. 私有部署的商业价值 在当今企业数字化转型浪潮中&#xff0c;大语言模型的应用已经成为提升效率的关键工具。然而&#xff0c;依赖第三方SaaS服务不仅成本高昂&#xff0c;还存在数据安全和响应速度…...

免费开源甘特图工具GanttProject:从任务混乱到清晰可视化的完整解决方案

免费开源甘特图工具GanttProject&#xff1a;从任务混乱到清晰可视化的完整解决方案 【免费下载链接】ganttproject Official GanttProject repository 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject 还在为项目管理中的任务混乱、进度模糊而烦恼吗&#x…...

Qwen3-14B WebUI定制教程:更换主题、添加历史记录、导出对话功能

Qwen3-14B WebUI定制教程&#xff1a;更换主题、添加历史记录、导出对话功能 1. 准备工作与环境检查 在开始定制Qwen3-14B的WebUI之前&#xff0c;我们需要确保环境已经正确配置并运行。以下是准备工作步骤&#xff1a; 1.1 确认镜像版本与硬件配置 首先检查您的环境是否符…...