SpringBoot (一) 自动配置原理

目录

一 自动配置

1:数据源的手动配置

1:SpringBoot的自动配置

二 自动配置的完整流程:(底层)

1. 场景化依赖与Starter机制

2. 主程序入口与注解驱动

3. 自动配置类的加载与筛选

4. 自动配置类的实现逻辑

5. 自动配置的触发与执行流程

6. 自动配置的优势

补充:关键配置文件与调试技巧

三 自动配置类的实现:

1. 启动类与核心注解

2. 加载自动配置类

3. 条件化装配

4. 配置属性绑定

5. 组件创建与注入

6. 结果整合

核心优势


概念

SpringBoot帮我们简单快速的创建一个独立的、生产级别的Spring应用;

1 核心特性

  1. 简化配置

    • 自动配置(Auto-Configuration):根据类路径中的依赖自动配置 Spring 应用。例如,引入 spring-boot-starter-data-jpa 后,Spring Boot 会自动配置数据源和 JPA 相关 Bean。

    • 外部化配置:支持通过 application.properties/application.yml、环境变量或命令行参数灵活配置应用,并支持多环境(如 dev/prod)配置。

  2. 内嵌服务器

    • 默认集成 Tomcat,也可选择 Jetty 或 Undertow。无需部署 WAR 包,直接打包为可执行 JAR 文件,通过 java -jar 命令运行。

  3. 起步依赖(Starter Dependencies)

    • 提供预定义的依赖集合(如 spring-boot-starter-web 包含 Spring MVC、Tomcat 等),简化 Maven/Gradle 依赖管理,避免版本冲突。

  4. 生产就绪功能(Spring Boot Actuator)

    • 提供监控和管理端点(如 /health/metrics),支持健康检查、性能指标收集和日志管理,便于运维。

  5. 开发者工具(DevTools)

    • 支持热部署、自动重启和实时重新加载,提升开发效率。

  6. 集成测试支持

    • 提供 @SpringBootTest 进行全栈集成测试,以及 @WebMvcTest@DataJpaTest 等切片测试注解,简化测试流程。

一 自动配置

手动配置大于自动配置 

概念:基于项目的依赖和类路径中的内容,自动配置 Spring 应用所需的组件

1:数据源的手动配置

<!--     导入druid的依赖   --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>

数据源配置(人为手动的引用配置文件当中的信息)

package org.example.springmvc.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class DataSourceConfig {@Value("${spring.datasource.username}")private String username;@Value("${spring.datasource.password}")private String password;@Value("${spring.datasource.driver-class-name}")private String driverClassName;@Value("${spring.datasource.url}")private String url;@Beanpublic DruidDataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setDriverClassName(driverClassName);dataSource.setUrl(url);return dataSource;}}

1:SpringBoot的自动配置

当项目引入 Spring Boot 的数据库相关依赖(如 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa)时,Spring Boot 的自动配置机制会尝试根据以下逻辑处理数据库连接

  • 前提条件
    必须满足以下两点,Spring Boot 才会自动配置默认数据源(如 HikariCP):

    1. 项目中存在数据库驱动依赖(如 mysql-connector-java)。

    2. 配置文件中提供了 数据库连接四要素(URL、用户名、密码、驱动类名)

  • 默认行为:

        Spring Boot 会基于上述配置自动创建数据源(默认使用 HikariCP),无需手动编写 @Bean 配置类。

配置文件当中指定配置类型

这种不直接指定的默认Hikari

如果在配置文件当中指定

会使用你指定的类型

二 自动配置的完整流程:

关于Spring Boot的自动配置机制,我的理解可以总结为以下几个核心要点:


1. 场景化依赖与Starter机制

  • 场景选择:通过选择不同的Starter依赖(如spring-boot-starter-web),Spring Boot会自动引入该场景所需的全部依赖库(如Tomcat、Spring MVC、Jackson等)。这相当于声明了项目的功能需求,例如Web开发需要内嵌服务器和HTTP处理能力。

  • 依赖传递:所有Starter都继承自spring-boot-starter,它提供了核心库(如spring-core)、日志框架(SLF4J + Logback)以及自动配置的基础支持(spring-boot-autoconfigure)。


2. 主程序入口与注解驱动

  • @SpringBootApplication:这是组合注解,包含三个关键功能:

    1. @SpringBootConfiguration:标识当前类为配置类,等价于@Configuration,用于定义Bean。

    2. @EnableAutoConfiguration:启用自动配置的核心开关,触发AutoConfigurationImportSelector加载自动配置类。

    3. @ComponentScan:自动扫描当前包及其子包下的组件(@Component@Service等),将它们注册为Bean。


3. 自动配置类的加载与筛选

  • AutoConfigurationImportSelector:该类负责加载所有预定义的自动配置类。具体流程如下:

    1. 定位配置文件:从所有依赖的JAR包中查找META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件。

    2. 批量导入配置类:读取文件中列出的全限定类名(如WebMvcAutoConfigurationDataSourceAutoConfiguration等)。

    3. 条件化筛选:每个自动配置类通过@Conditional系列注解(如@ConditionalOnClass@ConditionalOnMissingBean)判断是否生效。例如:

      • @ConditionalOnClass(DataSource.class):仅在类路径存在DataSource类时生效。

      • @ConditionalOnMissingBean(DataSource.class):仅在用户未手动定义DataSource Bean时生效。


4. 自动配置类的实现逻辑

  • 配置类结构:每个自动配置类(如DataSourceAutoConfiguration)通过@Bean方法定义组件,并配合条件注解控制是否生效。

  • 默认值设置:自动配置类会读取application.properties中的配置项(如spring.datasource.url),若用户未配置则使用合理的默认值。

  • 优先级规则:用户手动定义的Bean优先级高于自动配置类,实现灵活覆盖。


5. 自动配置的触发与执行流程

  1. 项目启动:执行主类的main方法,初始化Spring上下文。

  2. 加载自动配置类:通过AutoConfigurationImportSelector加载所有符合条件的配置类。

  3. 条件化装配:依次执行每个自动配置类,根据条件注解决定是否创建Bean。

  4. Bean注册:最终将所有符合条件的Bean注册到IoC容器中,完成依赖注入。


6. 自动配置的优势

  • 减少样板代码:无需手动配置DispatcherServletDataSource等通用组件。

  • 按需加载:仅加载与当前场景相关的配置类(如未引入Redis依赖,则相关配置类不生效)。

  • 高扩展性:用户可通过自定义Bean或配置文件覆盖默认行为。


补充:关键配置文件与调试技巧

  • 自动配置列表AutoConfiguration.imports文件中列出了所有自动配置类,位置在spring-boot-autoconfigure包的META-INF/spring目录下。

  • 调试日志:启动时添加-Ddebug参数,控制台会输出所有自动配置类的生效与排除原因,便于排查问题。

三句话概括:

  • 1 场景启动器一导入,就从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中导入一大堆自动配置类(类XxxAutoConfiguration)
  • 2 这些xxxAutoConfiguration基于@conditional条件注解导入一堆组件
  • 3 业务就可以使用这些组件了

类路径下的文件

三 自动配置类的实现:


1. 启动类与核心注解

项目启动时,主类上的 @SpringBootApplication 注解触发自动配置。该注解整合了三个核心功能:

  • 配置类声明:标记主类为Spring的配置类。

  • 组件扫描:自动探测并注册当前包下的组件(如Service、Controller)。

  • 启用自动配置:激活Spring Boot的自动配置机制。


2. 加载自动配置类

  • 自动配置列表:Spring Boot内置了上百个自动配置类(如DataSourceAutoConfigurationWebMvcAutoConfiguration),这些类定义在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中。

  • 按需加载:通过AutoConfigurationImportSelector筛选并加载这些配置类,但并非全部生效,需通过条件判断。


3. 条件化装配

每个自动配置类通过 @Conditional系列注解 控制是否生效,例如:

  • 存在类时生效:如检测到类路径中有DataSource类,才加载数据源配置。

  • 无自定义Bean时生效:若用户未手动定义某个Bean(如DataSource),才使用默认配置。

  • 配置属性匹配时生效:如根据spring.datasource.url是否存在决定是否初始化数据库连接。


4. 配置属性绑定

  • 属性映射:通过@ConfigurationProperties将配置文件(如application.properties)中的属性(如spring.datasource.url)绑定到Java对象。

  • 动态适配:自动配置类读取这些属性值,用于初始化组件(如数据库连接池的URL、用户名)。


5. 组件创建与注入

  • 默认Bean创建:自动配置类通过内部逻辑创建标准化的Bean(如DataSourceDispatcherServlet)。

  • 用户自定义优先:若用户手动定义了同名Bean(如自己写的@Bean DataSource),则覆盖默认实现。


6. 结果整合

所有生效的自动配置类共同作用,最终完成以下工作:

  • 依赖管理:根据项目引入的Starter(如spring-boot-starter-web)按需加载功能模块。

  • 组件装配:自动注册Bean到Spring容器,如内嵌Tomcat、JSON解析器、数据库连接池等。

  • 环境适配:结合配置文件中的参数,动态调整组件行为(如连接池大小、超时时间)。


核心优势

  • 开箱即用:无需手动配置常见功能(如Web服务器、数据库连接)。

  • 按需加载:仅初始化与当前依赖和配置匹配的功能模块,避免资源浪费。

  • 灵活扩展:用户可通过配置文件或自定义Bean轻松覆盖默认行为。

两句话:

  • 1 把属性类和配置列进行绑定
  • 2 组件要用的所有属性放到容器中

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

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

相关文章

OJ题:移动零

双指针法 c 语言实现 void moveZeroes(int* nums, int numsSize) {int dest,cur; //创建临时指针和目标指针destcur0;//出初始化while(cur<numsSize)//遍历{if(nums[cur]!0){swap(&nums[cur],&nums[dest]);cur;dest;}else{cur;}}} 思路是建立两个指针&#xff0…

pycharm终端操作远程服务器

pycharm项目已经连接了远程服务器&#xff0c;但是打开终端&#xff0c;却依旧显示的是本地的那个环境&#xff0c;也就是说没有操作远程的那个环境。只能再使用Xshell去操作远程环境&#xff0c;很麻烦&#xff0c;找了下教程。 来源&#xff1a;https://blog.csdn.net/maolim…

(头歌作业—python)3.2 个人所得税计算器(project)

第1关&#xff1a;个人所得税计算器 任务描述 本关任务&#xff1a;编写一个个人所得税计算器的小程序。 相关知识 个人所得税缴纳标准 2018 年 10 月 1 日以前&#xff0c;个税免征额为 3500 元/月&#xff0c;调整后&#xff0c;个税免征额为 5000 元/月&#xff0c; 7 级超…

Redis场景问题1:缓存穿透

Redis 缓存穿透是指在缓存系统&#xff08;如 Redis&#xff09;中&#xff0c;当客户端请求的数据既不在缓存中&#xff0c;也不在数据库中时&#xff0c;每次请求都会直接穿透缓存访问数据库&#xff0c;从而给数据库带来巨大压力&#xff0c;甚至可能导致数据库崩溃。下面为…

CUDA Memory Fence 函数的功能与硬件实现细节

CUDA Memory Fence 函数的功能与硬件实现细节 Memory Fence 的基本功能 CUDA中的memory fence函数用于控制内存操作的可见性顺序&#xff0c;确保在fence之前的内存操作对特定范围内的线程可见。主要功能包括&#xff1a; 排序内存操作&#xff1a;确保fence之前的内存操作在…

实战篇Redis

黑马程序员的Redis的笔记&#xff08;后面补一下图片&#xff09; 【黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…

Reactive编程:什么是Reactive编程?Reactive编程思想

文章目录 **1. Reactive编程概述****1.1 什么是Reactive编程&#xff1f;****1.1.1 Reactive编程的定义****1.1.2 Reactive编程的历史****1.1.3 Reactive编程的应用场景****1.1.4 Reactive编程的优势** **1.2 Reactive编程的核心思想****1.2.1 响应式&#xff08;Reactive&…

异步转同步,实现一个消息队列

有一个场景&#xff0c;需要实现一个消息队列&#xff0c;要求 1&#xff0c;3&#xff0c;4 秒后&#xff0c;依次打印 1&#xff0c;2&#xff0c;3&#xff0c;如下&#xff1a; 其实考察的是怎么用同步的方式实现异步。 本文总结了四种方式实现&#xff1a;常规嵌套、prom…

【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望

【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望 #微服务实战 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事务 #Seata #ServiceMesh #总结 #SpringCloud #SpringBoot 系列终章&#xff1a;经过前九篇 [【深度 Mape 系列】] 的系统学习…

求职笔试题

PDD 最长公共子序列 1143-最长公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:"""二维动态规划"""m, n len(text1), len(text2)# dp [[0]* (n1)] * (m1) 这种写法错误&#xff0c;m1行…

【MySQL基础-16】MySQL DELETE语句:深入理解与应用实践

1. DELETE语句基础&#xff1a;数据删除的艺术 在数据库管理中&#xff0c;DELETE语句是维护数据完整性和清理过期信息的关键工具。与日常生活中的"删除"不同&#xff0c;数据库中的删除操作需要更加谨慎和精确&#xff0c;因为数据一旦删除&#xff0c;恢复可能非常…

python学习笔记(3)——元组

Python3 元组全面详解 一、元组的定义与特性 基本概念 元组(Tuple)是Python中的不可变序列,用小括号()表示,元素用逗号分隔。与列表不同,元组一旦创建,元素不能修改、添加或删除(元素本身为可变对象的情况除外)。 不可变性 • 元组的每个元素的引用不可变,但若元素是可…

Android 中实现一个自定义的 AES 算法

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 前言 AES&#xff08;Advanced Encryption Standard&#xff0c;高级加密标准&#xff09; 是一种 对称加密算法&#xff0c;用于加密和解密数据。AES 由 美国…

小河:团队金牌精准计划

【趋势识别与预测】 数据趋势分析在随机序列研究中首要价值在于识别潜在规律并提升预测能力。随机序列常表现为无规则波动&#xff0c;但通过滑动平均、指数平滑、小波变换等方法&#xff0c;可剥离噪声干扰&#xff0c;提取长期趋势或周期性成分。例如&#xff0c;在金融时间序…

S32K144外设实验(七):FTM输出多路互补带死区PWM

文章目录 1. 概述1.1 时钟系统1.2 实验目的2. 代码的配置2.1 时钟配置2.2 FTM模块配置2.3 输出引脚配置2.4 API函数调用1. 概述 互补对的PWM输出是很重要的外设功能,尤其应用再无刷电机的控制。 1.1 时钟系统 笔者再墨迹一遍时钟的设置,因为很重要。 FTM的CPU接口时钟为SY…

数据结构与算法:算法分析

遇到的问题&#xff0c;都有解决方案&#xff0c;希望我的博客能为您提供一点帮助。 本篇参考《Data Structures and Algorithm Analysis in C》 “在程序设计中&#xff0c;不仅要写出能工作的程序&#xff0c;更要关注程序在大数据集上的运行时间。” 本章讨论要点&#xf…

Redis数据持久化机制 + Go语言读写Redis各种类型值

Redis&#xff08;Remote Dictionary Server&#xff09;作为高性能的键值存储系统&#xff0c;凭借其丰富的数据类型和原子性操作&#xff0c;成为现代分布式系统中不可或缺的组件。 1、Redis支持的数据类型 Redis支持的数据类型可归纳为以下9类&#xff1a; String&#x…

排序--归并排序

一&#xff0c;引言 归并排序作为七大排序中一种&#xff0c;本文将讲解其排序原理和代码实现。 二&#xff0c;逻辑讲解 来看一组动图&#xff1a; 首先先进行大逻辑的讲解&#xff0c;在一个乱序的数组中如图&#xff1a; 通过递归进行一次次分组如图&#xff1a; 分组逻…

React程序打包与部署

===================== 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 为生产环境准备React应用最小化和打包环境变量错误处理部署到托管服务部署到Netlify探索高级主题:Hooks、Su…

Spring Data审计利器:@LastModifiedDate详解(依赖关系补充篇)!!!

&#x1f552; Spring Data审计利器&#xff1a;LastModifiedDate详解&#x1f525;&#xff08;依赖关系补充篇&#xff09; &#x1f50c; 核心依赖解析 使用LastModifiedDate必须知道的依赖关系 #mermaid-svg-qm1OUa9Era9ktbeK {font-family:"trebuchet ms",verd…