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

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 组件要用的所有属性放到容器中

补充:

  1. 正确点

    • 配置信息的最终来源相同(外部配置文件)。

    • 若用户未手动创建Bean,Spring自动配置生效;若用户定义Bean,优先使用用户定义。

  2. 需补充点

    • 手动配置不一定依赖属性类:开发者可以选择更灵活的配置注入方式(如 @Value),但推荐使用属性类以保持结构化和类型安全。

    • 自动配置强制使用属性类:这是Spring Boot设计上的一致性要求,确保配置管理的标准化。


http://www.mrgr.cn/news/96400.html

相关文章:

  • pyinstaller 对 pyexecjs模块打包老会有终端框闪烁
  • MySQL多表查询实验
  • GHCTF-web-wp
  • Linux进程管理之子进程的创建(fork函数)、子进程与线程的区别、fork函数的简单使用例子、子进程的典型应用场景、父进程等待子进程结束后自己再结束
  • PwnMe CTF 2025 web
  • 高等数学-第七版-上册 选做记录 习题7-4
  • python学习笔记(3)——元组
  • 网络华为HCIA+HCIP 策略路由,双点双向
  • 【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft 服务器搭建,并实现远程联机,详细教程
  • docker启动nacos+redis+seata
  • IO模型之于并发编程模型、并发模型之于架构模式
  • 【SPP】蓝牙串口协议(SPP)深度解析:从 RS232 仿真到设备互联的技术实现
  • [GXYCTF2019]禁止套娃1 [GitHack] [无参数RCE]
  • FPGA调试笔记
  • docker部署mongodb数据库
  • 【HC-05蓝牙模块】主要性能指标与通信基础知识
  • 【Git教程】将dev分支合并到master后,那么dev分支该如何处理
  • SHELL 三剑客
  • AI 时代,我们该如何写作?
  • 基于kafka的分布式日志收集平台项目(第三部分)