springboot自动配置原理例子讲解

Spring Boot 的自动配置是其核心特性之一,它帮助开发者**"开箱即用"**地使用各种第三方库或 Spring 组件,而无需手动配置 Bean。这一切的背后,都依赖于 Spring Boot 的自动配置机制。


我们分两部分来说:

  1. Spring Boot 自动配置的整体流程

  2. 我们依赖的第三方包是如何一步步被自动配置并导入使用的


一、Spring Boot 自动配置的整体流程

1. @SpringBootApplication 注解启动入口
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
  • @SpringBootApplication 是一个组合注解,包含:

    • @SpringBootConfiguration(实际上就是 @Configuration

    • @EnableAutoConfiguration

    • @ComponentScan

2. 关键点:@EnableAutoConfiguration

这个注解的作用就是启用自动配置,底层依赖的是:

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)

这里的核心逻辑是:导入一批配置类,这些类就定义了我们依赖的组件如何被自动装配。

3. AutoConfigurationImportSelector 工作机制
  • 它会去加载 META-INF/spring.factories(Spring Boot 2.x) 或 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Spring Boot 3.x)中的配置类列表。

  • 这些类就是一堆以 xxxAutoConfiguration 结尾的类,比如:

# META-INF/spring.factories(Spring Boot 2.x)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
...

Spring Boot 会按需加载这些自动配置类,也就是判断你是否引入了相关依赖、是否配置了对应属性等,来决定要不要配置这个组件。


二、依赖的包是如何一步步自动配置导入的?

举个例子:我们引入了 spring-boot-starter-data-redis,程序中就能直接用 RedisTemplate

来看这条链路是怎么走通的:

步骤 1:你引入了 Redis 的 starter
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

它的依赖会自动包含:

  • spring-data-redis

  • lettuce-core(默认客户端)

  • spring-boot-autoconfigure

步骤 2:自动配置类生效

spring-boot-autoconfigure 包的 spring.factories 文件中,你会看到:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration

这个配置类就被加载了。

步骤 3:RedisAutoConfiguration 中的 Bean 被自动注册

打开源码可以看到:

@Configuration
@ConditionalOnClass(RedisOperations.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {...}
}

这表示:

  • 如果项目中有 Redis 相关类(即你引入了相关依赖)

  • 如果容器里没有手动注入 RedisTemplate

  • 那就自动帮你注册一个默认的 RedisTemplate Bean

步骤 4:你就可以在代码中使用了
@Autowired
private RedisTemplate redisTemplate;

你并没有显式配置 Redis 相关的 Bean,但因为自动配置已经做完了,所以直接就能使用。


总结流程图

@SpringBootApplication↓
@EnableAutoConfiguration↓
AutoConfigurationImportSelector↓
读取 spring.factories / spring-autoconfigure-metadata↓
加载 xxxAutoConfiguration 类↓
根据条件注册 Bean(@ConditionalOnClass / OnBean / OnProperty)↓
你就能直接使用这些 Bean

补充:如何自定义或覆盖自动配置?

  • 如果你自己定义了同名 Bean,比如 RedisTemplate,就会覆盖自动配置(@ConditionalOnMissingBean 生效)。

  • 想要禁用某个自动配置,可以通过:

spring.autoconfigure.exclude:- org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration

如果你有某个具体依赖包的例子(比如 MyBatis、Kafka、Elasticsearch),我也可以具体分析它的自动配置链路。需要的话随时说~

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

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

相关文章

一款基于 .NET 8 + Vue 开源的、企业级中后台权限管理系统

前言 今天大姚给大家分享一款基于 .NET 8 Vue 开源、前后端分离的企业级中后台权限管理系统&#xff0c;助力快速完成常规业务需求开发&#xff1a;ApeVolo.Admin。 项目介绍 ApeVolo.Admin 一款基于.NET 8、SqlSugar、Vue、Elment UI、RBAC、前后端分离、开源&#xff08;…

vue3腾讯云直播 前端推流

1、在index.html文件中引入&#xff08;在body体中&#xff09; <script src"https://video.sdk.qcloudecdn.com/web/TXLivePusher-2.1.1.min.js" charset"utf-8"></script> 2、vue文件中&#xff0c;添加video推流&#xff08;我用的推流地…

蓝叠模拟器过检测全攻略

BlueStacks蓝叠MagiskLsposed安装和过应用检测教程 蓝叠MagiskLsposed安装和过应用检测教程 引言 蓝叠模拟器凭借其出色的性能和兼容性&#xff0c;在电脑上运行安卓应用和游戏方面备受青睐。然而&#xff0c;众多应用和游戏为确保公平性与安全性&#xff0c;加入了模拟器检测…

Flutter Invalid constant value.

0x00 问题 参数传入变量&#xff0c;报错&#xff01; 代码 const Padding(padding: EdgeInsets.all(20),child: GradientProgressIndicator(value: _progress), ),_progress 参数报错&#xff1a;Invalid constant value. 0x01 原因 这种情况&#xff0c;多发生于&#xff…

搜广推校招面经七十一

滴滴算法工程师面经 一、矩阵分解的原理与优化意义 矩阵分解在推荐系统中是一个非常核心的方法&#xff0c;尤其是在 协同过滤(Collaborative Filtering) 中。我们可以通过用户对物品的评分行为来推测用户的喜好&#xff0c;从而推荐他们可能喜欢的内容。 1.1. 直观理解&…

实习技能记录【2】-----LVGL[基本概念]

LVGL主要概念 1. Screen (屏幕): 概念: 屏幕是 LVGL 应用程序中的顶层容器。它是用户界面的根对象&#xff0c;所有的可见 UI 元素最终都会添加到某个屏幕上&#xff08;通常是活动屏幕&#xff09;。 功能: 作为其他 UI 元素的父对象。 可以拥有自己的背景颜色、背景图片等样…

【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 一、列表初始化 1. 大括号初始化 2. initializer_list 二、右值引用和移动语义 1. 左值和右值 2. 左值引用和右值引用 引用延长生命周期 左…

软考中级-软件设计师 2022年下半年上午题真题解析:通关秘籍+避坑指南

&#x1f4da; 目录&#xff08;快速跳转&#xff09; 选择题&#xff08;上午题&#xff09;&#xff08;每题1分&#xff0c;共75分&#xff09;一、 计算机系统基础知识 &#x1f5a5;️&#x1f4bb; 题目1&#xff1a;计算机硬件基础知识 - RISC&#xff08;精简指令集计算…

基于MCP协议调用的大模型agent开发02

目录 在AI agent的开发过程中&#xff0c;如何使用mcp服务器作为大模型的工具调用‘百宝箱’&#xff1f; FastAPI FastMCP 本系列&#xff1a; 基于MCP协议调用的大模型agent开发01-CSDN博客 基于MCP协议调用的大模型agent开发02-CSDN博客 在AI agent的开发过程中&#xff0c;…

ES6(8) Fetch API 详解

1. Fetch API 简介 fetch 是 ES6 提供的基于 Promise 的 API&#xff0c;用于发送 HTTP 请求并处理服务器响应数据。与传统的 XMLHttpRequest 相比&#xff0c;fetch 语法更加简洁&#xff0c;使用 Promise 进行异步处理&#xff0c;避免了回调地狱。 1.1 fetch() 的基本用法 …

原生SSE实现AI智能问答+Vue3前端打字机流效果

实现流程&#xff1a; 1.用户点击按钮从右侧展开抽屉&#xff08;drawer&#xff09;&#xff0c;打开模拟对话框 2.用户输入问题&#xff0c;点击提问按钮&#xff0c;创建一个SSE实例请求后端数据&#xff0c;由于SSE是单向流&#xff0c;所以每提一个问题都需要先把之前的实…

CUDA 工具链将全面原生支持 Python

根据 NVIDIA 在 2025 年 GTC 大会上的官宣&#xff0c;CUDA 工具链将全面原生支持 Python 编程&#xff0c;这一重大更新旨在降低 GPU 编程门槛&#xff0c;吸引更广泛的 Python 开发者进入 CUDA 生态。以下是核心信息整合&#xff1a; 1. 原生支持的意义与背景 无需 C/C 基础…

jupyter notebook 显示conda虚拟环境

使用 nb_conda_kernels 安装 nb_conda_kernels&#xff1a;这个包可以自动从你的 Conda 环境中发现并列出内核。 conda activate base # 确保你在 base 环境或任何其他环境中安装 conda install nb_conda_kernels显示jupyternotebook当前所在的位置。

【AI】MCP概念

一文讲透 MCP&#xff08;附 Apifox MCP Server 内测邀请&#xff09; 7分钟讲清楚MCP是什么&#xff1f;统一Function calling规范&#xff0c;工作量锐减至1/6&#xff0c;人人手搓Manus&#xff01;&#xff1f; | 一键链接千台服务器&#xff0c;几行代码接入海量外部工具…

WSL1升级到WSL2注意事项

今天要在WSL上安装docker&#xff0c;因为机器上安装了wsl1&#xff0c;docker安装后启动不了&#xff0c;通过询问deepseek发现docker只能在wsl2上安装&#xff0c;因此就想着将本机的wsl1升级到wsl2。 确保你的 Windows 系统是 Windows 10&#xff08;版本 1903 及以上&…

Pycharm常用快捷键总结

主要是为了记录windows下的PyCharm的快捷键&#xff0c;里面的操作都试过了功能描述会增加备注。 文件操作 快捷键功能描述Ctrl N新建文件Ctrl Shift N根据名称查找文件Ctrl O打开文件Ctrl S保存当前文件Ctrl Shift S另存为Alt F12打开终端&#xff08;Terminal&…

电池分选机:新能源时代的品质守护者|深圳比斯特自动化

在这个新能源蓬勃发展的时代&#xff0c;电池作为能量的存储与释放单元&#xff0c;其性能与质量直接关系到整个系统的稳定运行与效率提升。而电池分选机&#xff0c;作为电池生产流程中的关键一环&#xff0c;正扮演着品质守护者的角色&#xff0c;为新能源产业的高质量发展保…

认识 Linux 内存构成:Linux 内存调优之虚拟内存与物理内存

写在前面 博文内容涉及 Linux 内存构成基本认知包括虚拟内存和物理内存映射,多级页表和MMU简单认知理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的…

SCI科学论文的重要组成部分

科学论文的核心结构 科学论文通常遵循IMRAD结构&#xff0c;即&#xff1a; 引言(Introduction)方法(Methods)结果(Results)讨论(Discussion) 除此之外&#xff0c;还包括其他几个关键部分。让我为您详细介绍每个部分的作用和重要性&#xff1a; 1. 标题(Title) 标题是论文…

期权时间价值与隐含波动率怎么选?

期权隐含波动率与时间价值要怎么选&#xff1f;期权隐含波动率IV对期权价格有着巨大的影响。整体来看&#xff0c;期权隐波与期权价格呈正相关关系。当期权隐波从低水平上升时&#xff0c;期权价格也会相应上涨&#xff1b;反之&#xff0c;当隐波下降&#xff0c;期权价格则会…