Spring Boot 自动配置原理详解

news/2025/1/20 0:09:08/文章来源:https://www.cnblogs.com/wys777/p/18680545

引言
Spring Boot 的一大亮点是它能够自动配置(Auto-Configuration)Spring应用程序,极大地简化了Spring应用的创建过程。开发者只需添加所需的依赖,Spring Boot就会根据这些依赖和一些预设条件自动装配相应的组件,从而减少了大量样板代码的编写。

第三方组件的集成方式
对于第三方依赖中的组件,如果它们没有位于默认的组件扫描路径下,可以采用以下两种方法之一来确保它们能被正确识别和加载。例如,如果你有一个外部库,并且希望该库中的某些特定服务能够作为Spring管理的Bean,你可以选择性地将它们通过 @Import 或者调整 @ComponentScan 的参数来包含进去。:

1. 通过 @ComponentScan 注解扫描指定的包:
开发者可以在主应用类或配置类上使用 @ComponentScan 来指定需要扫描的包路径。这样,Spring将会在启动时自动查找并注册这些包下的所有组件。
2. 通过 @Import 注解将其导入到IoC容器中:
@Import 提供了一种更直接的方法来引入额外的配置或者组件。它可以用于导入普通类、配置类、实现了 ImportSelector 接口的类以及以 @EnableXxx 形式的自定义注解。这种方式效率更高、性能更好。

源码跟踪
接下来,我们将深入探讨Spring Boot如何处理自动配置的相关源码细节。我们项目的启动类上默认包含 @SpringBootApplication 注解,实际上这个注解包含了多个重要的功能:

@SpringBootApplication 是一个复合注解,集成了三个重要的功能:

  1. @SpringBootConfiguration:底层是一个@Configuration注解,表示当前引导类也是一个配置类
  2. @ComponentScan:启动组件扫描,表示Spring会自动扫描引导类所在的包及子包下能够识别的组件
  3. @EnableAutoConfiguration:启用Spring Boot的自动配置机制,这是Spring Boot的核心特性之一。

@EnableAutoConfiguration 深入分析

@EnableAutoConfiguration 注解通过@Import引入了一个名为 AutoConfigurationImportSelector 的选择器。这个选择器的作用是从 META-INF/spring.factories 文件中扫描名称为 EnableAutoConfiguration 对应的字符串列表,加载进内存封装成一个数组,最后会根据各种条件【起步依赖、@Conditional相关注解】进行过滤,找到匹配条件的全类名,并封装成字符串数组到内存中。在调用run方法时,通过反射创建对象并交给Spring容器管理。

此外,从版本2.2开始,Spring Boot引入了 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件来替代部分在 spring.factories 中定义的内容。这使得自动配置更加模块化,并且有助于减少内存占用和提高性能。

自动配置的选择逻辑

当应用程序启动时,AutoConfigurationImportSelector 会调用 selectImports() 方法,此方法负责读取上述文件中的配置项。然后,它会对这些配置项进行过滤,以确保只有满足特定条件的配置才会被激活。过滤条件通常包括但不限于:

应用程序是否包含了某些类或库
是否存在特定的Bean定义
环境变量或属性文件中的设置

条件化配置

自动配置过程中,@Conditional 注解及其派生注解扮演了重要角色。它们允许开发者指定仅在满足特定条件下才执行的配置。比如:

  • @ConditionalOnClass 和 @ConditionalOnMissingClass:基于类路径中是否存在某个类。
  • @ConditionalOnProperty:依据配置文件中的属性值。
  • @ConditionalOnBean 和 @ConditionalOnMissingBean:检查容器内是否存在某种类型的Bean。
    这些条件可以帮助更精确地控制哪些自动配置应该生效,从而避免不必要的冲突或者资源浪费。

结论

总之,Spring Boot 的自动配置机制不仅简化了Spring应用的开发流程,还提高了项目的可维护性和扩展性。理解其工作原理对于优化应用程序性能、定制化配置以及解决潜在问题都至关重要。希望这篇文章能帮助读者更好地掌握Spring Boot自动配置背后的技术细节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/871928.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

传奇

毋庸置疑,很多人的心里,都有一个传奇、传奇3,80后、90后,甚至70后尤甚。当然也包括我。主要当然因我曾经是盛大游戏传奇工作室研发团队的一员,且是盛大传奇3项目部的第一个程序技术人员,内心对传奇、传奇3的感情非同一般。因工作等原因,我早已不再从事传奇类游戏的开发研…

常用工具

类似gdb的bash调试工具bashdb: https://sourceforge.net/projects/bashdb/files/bashdb/ 非常好用,结合vscode bashdb(bash debug) shift + command + d,配置 .vscode/launch.json

《CPython Internals》阅读笔记:p232-p249

《CPython Internals》学习第 13天,p232-p249 总结,总计 18 页。 一、技术总结 无。 二、英语总结(生词:1) 1.overhead (1)overhead: over-("above") + head(“top part, uppermost section”) overhead的字面意思是:above the head,后来演变成"represent …

2025春秋杯冬季赛MISC部分题目复现

简单算术 异或直接得出flagfind_me 进游戏用fill指令把命令方块填充掉然后切创造或者观察找将文件解压出来后看结构是MC的存档文件,于是用MC跑,提示要找雪屋,在附近雪屋的箱子里有给压缩包密码 解压后得到:unai?535.0a20[189.[4049[ax30[e.j60xaj91x8+随波逐流一把梭音频的秘密…

CogAgent: A Visual Language Model for GUI Agents

CogAgent: 利用VLM操作GUI。主要内容 提出了一个18B的VLM模型CogAgent(CogVLM的新版本),旨在提高对于GUI的理解、导航和交互能力。利用高分辨率和低分辨率编码器适应不同分辨率的输入,在9个VQA benchmarks上取得了sota。同时,CogAgent利用截屏输入,在PC和安卓GUI导航任务…

【原创】MAC OS 本地搭建部署 dify

一、什么是 dify?Dify 是一个开源的大语言模型(LLM)应用开发平台,融合了后端即服务(Backend as Service, BaaS)和 LLMOps 理念,旨在简化和加速生成式AI应用的创建和部署。它支持多种大型语言模型(如OpenAI的GPT系列、Claude3等),并提供强大的数据集管理功能、可视化的…

apollo收紧权限

apollo收紧权限 1 系统权限管理 限制只有超级管理员可以创建项目。 1.1 系统权限管理参数 apollo 用户默认是系统的超级管理员,拥有管理所有项目和项目下所有命名空间的权限。 apollo 用户登录系统,点击右上角的管理员工具.系统权限管理。(1) 为用户添加创建应用权限(系统参数…

2025春秋杯DAY2DAY3部分wp

2025春秋杯DAY2DAY3部分wp DAY2 WEB easy_ser 源码如下 <?php //error_reporting(0); function PassWAF1($data){$BlackList = array("eval", "system", "popen", "exec", "assert", "phpinfo", "shell_…

SIP MESSAGE消息中的Content-Type

The Content-Type header field indicates the media type of the message-body sent to the recipient. SIP消息中<Content-Type> 消息头表示发送的消息体的媒体类型。如果消息体不为空,则必须存在 Content-Type 消息头。如果消息体为空且 Content-Type 消息头存在,则…

Hugging Face功能介绍,及在线体验当前顶级文生图模型Flux

Hugging Face简介 对于非机器学习或深度学习领域的人士来说,Hugging Face这个名字可能并不耳熟。然而,随着近年来大规模模型的迅速崛起,相信大家或多或少都有所接触。如果你对这一领域感兴趣,并在GitHub上查阅过一些开源资料,那么你一定会频繁地看到Hugging Face的身影。例…

[JavaScript] 深入理解流程控制结构

在编程中,流程控制是指控制代码执行顺序的机制。通过流程控制结构,我们可以根据不同的条件执行不同的代码块,实现逻辑判断、循环遍历和跳出循环等功能。常见的流程控制语句有:if-else、switch-case、for、while,以及控制语句break和continue。本文将详细讲解这些控制结构的…

ELF2开发板(rk3588飞凌)

ELF2开发板(飞凌嵌入式) 开箱包裹内容打开包装,你可以看到以下物品一个绿联的usb3.0读卡器、sandisk的32g内存卡(太好了) rk3588 4g+32g emmc版本ELF2开发板 输出为12v 3A的电源适配器(和ipad的充电器外观好像)图1 外包装盒图2 开箱物品内容图3 ELF2开发板正面图4 ELF2开发…