当前位置: 首页 > 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;

    @Bean
    public 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.dtcms.com/a/98267.html

相关文章:

  • 字典翻转教学
  • 买卖股票的最佳时机(121)
  • Kubernetes对象基础操作
  • 现代几何风海报标签徽标logo设计psai衬线英文字体安装包 Myfonts – Nexa Serif Font Family
  • 精通React JS中的API调用:示例指南
  • RAG基建之PDF解析的“无OCR”魔法之旅
  • ESP-01模块连接手机热点问题及解决方法
  • nacos 外置mysql数据库操作(docker 环境)
  • 如何迁移AxureCloud到新服务器?
  • Jenkins插件安装失败如何解决
  • 惠普(HP)和联想(Lenovo)作为全球两大电脑品牌,并不是简单的“拼接电脑”
  • Vue 中render函数的作用,如何使用它进行更灵活的组件渲染?
  • 代码随想录算法训练营第四十六天|回文子串专题: 647. 回文子串、516.最长回文子序列
  • DSP+AI综合应用案例1——三种波形识别(预告)
  • java网盘项目 目前 文件有分享表 文件夹也要创建分享表吗
  • 伯恩茅斯 vs 曼城
  • Java 输入流到输出流
  • 开发过程中需要安装的浏览器插件
  • 【学Rust写CAD】17 通用2D仿射变换矩阵结构体(matrix/generic.rs)
  • keil中文注释出现乱码怎么解决
  • Selenium自动化测试中常见报错类型及解决方案
  • 【Qt】三种操作sqlite3的方式及其三种多表连接
  • 总结PostgreSQL创建数据库失败的解决办法
  • SQL语句及其应用(中)(DQL语句之单表查询)
  • 机器学习的一百个概念(1)单位归一化
  • java项目之基于ssm的乡镇自来水收费系统(源码+文档)
  • 签名计算:对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)【java版本、JS(Vue)、iOS版本的实现】
  • LocalDateTime序列化总结
  • 接龙数列(最长上升 动规)
  • 第十六章 常用算法