Spring Boot 的自动配置机制是它的重要特性之一,极大地简化了 Spring 应用的配置工作。自动配置的核心思想是基于类路径中的依赖、环境配置以及自定义代码进行智能化配置,避免了开发者手动编写大量的样板代码。

接下来,我将详细介绍 Spring Boot 自动配置的过程,核心原理以及涉及的关键组件,并结合源码进行深入解析。

一、Spring Boot 自动配置的工作流程

  1. @SpringBootApplication 注解

    自动配置的起点通常是 @SpringBootApplication 注解,它是一个组合注解,包含了三个重要注解:

    • @SpringBootConfiguration:标记为一个 Spring 配置类,类似于 @Configuration
    • @EnableAutoConfiguration:启用 Spring Boot 的自动配置机制。
    • @ComponentScan:扫描当前包及其子包下的所有 Spring 组件。

    其中 @EnableAutoConfiguration 是自动配置的核心,它引导自动配置机制。

  2. @EnableAutoConfigurationAutoConfigurationImportSelector

    @EnableAutoConfiguration 注解的作用是告诉 Spring Boot 启动时自动配置 Spring 应用上下文。该注解引入了 AutoConfigurationImportSelector,这是自动配置的核心处理器。

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import(AutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {
    }

    AutoConfigurationImportSelector 类会从配置文件中(通常是 spring.factories)读取所有的自动配置类,并将它们导入到应用上下文中。

  3. spring.factories 文件

    自动配置类是通过 spring-boot-autoconfigure 模块的 META-INF/spring.factories 文件来配置的。这个文件中列出了所有可以被自动加载的配置类:

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
    org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
    org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
    ...

    这些配置类会在 Spring Boot 启动时根据当前环境条件被选择性加载。

  4. 条件装配(@Conditional 系列注解)

    Spring Boot 并不是盲目地加载所有的自动配置类。每个自动配置类通常都会使用 @Conditional 系列注解来进行有条件的加载。最常见的条件注解有:

    • @ConditionalOnClass:当类路径中存在某个类时才生效。
    • @ConditionalOnMissingBean:当 Spring 上下文中不存在某个 Bean 时才生效。
    • @ConditionalOnProperty:当某个配置属性满足特定条件时才生效。
    • @ConditionalOnBean:当 Spring 上下文中存在某个 Bean 时才生效。

    例如,DataSourceAutoConfiguration 只有在项目中存在数据源相关的依赖(如 javax.sql.DataSource 类)时才会被加载。

  5. 自动配置类示例:DataSourceAutoConfiguration

    Spring Boot 中 DataSourceAutoConfiguration 是配置数据源的自动配置类,它的源码如下:

    @Configuration
    @ConditionalOnClass(DataSource.class)
    @EnableConfigurationProperties(DataSourceProperties.class)
    @Import({DataSourcePoolMetadataProvidersConfiguration.class,
    DataSourceInitializationConfiguration.class})
    public class DataSourceAutoConfiguration { @Bean
    @ConditionalOnMissingBean
    public DataSource dataSource(DataSourceProperties properties) {
    // 创建并返回 DataSource 对象
    return properties.initializeDataSourceBuilder().build();
    }
    }
    • @ConditionalOnClass(DataSource.class):只有当类路径下存在 DataSource 类时,才进行数据源的自动配置。
    • @ConditionalOnMissingBean:如果 Spring 上下文中没有其他 DataSource Bean,则自动配置一个。

    这种基于条件的配置方式确保了 Spring Boot 的灵活性,允许用户通过覆盖默认 Bean 或不满足条件的方式跳过某些自动配置。

二、Spring Boot 自动配置的核心步骤

  1. 收集自动配置类

    启动时,AutoConfigurationImportSelectorspring.factories 文件中读取所有的自动配置类,并通过 @Import 导入这些类。
  2. 条件检查

    自动配置类的加载不是无条件的,Spring Boot 会根据 @Conditional 注解进行条件检查,确保只有符合条件的自动配置类才会生效。
  3. 注入所需的 Bean

    一旦自动配置类通过条件检查,Spring Boot 就会根据这些配置类注册所需的 Bean。例如,DataSourceAutoConfiguration 会自动配置数据源相关的 Bean。
  4. 允许用户覆盖自动配置

    自动配置并不是强制的。用户可以通过显式声明自己的 Bean 来覆盖自动配置的默认行为。例如,如果用户在自己的配置类中定义了 DataSource,那么 Spring Boot 就不会再自动配置数据源。

三、Spring Boot 自动配置的实际案例

  1. Web 应用自动配置

    在 Spring Boot Web 应用中,DispatcherServletAutoConfiguration 负责自动配置 Spring MVC 的核心组件,例如 DispatcherServletRequestMappingHandlerMapping 等。

    • 如果项目中存在 spring-web 依赖,那么 DispatcherServletAutoConfiguration 会自动加载。
    • 如果没有手动定义 DispatcherServlet,Spring Boot 会自动创建一个 DispatcherServlet 并配置到 Spring 容器中。
  2. 数据库连接池自动配置

    Spring Boot 还会自动配置数据库连接池(如 HikariCP、Tomcat JDBC 等),这依赖于项目中的 spring-boot-starter-data-jpa 或者 spring-boot-starter-jdbc 依赖。

    • DataSourceAutoConfigurationDataSourceProperties 共同负责自动配置数据源。
    • 如果类路径中存在连接池类(如 HikariDataSource),那么 Spring Boot 就会自动配置连接池。

    同时,用户可以通过 application.properties 文件来自定义连接池配置:

    spring.datasource.url=jdbc:mysql://localhost:3306/mydb
    spring.datasource.username=root
    spring.datasource.password=secret
    spring.datasource.hikari.maximum-pool-size=10
  3. Spring Security 自动配置

    当引入 spring-boot-starter-security 依赖时,Spring Boot 会自动配置安全机制,默认提供 HTTP Basic 认证机制。

    • SecurityAutoConfiguration 负责自动配置 Spring Security 的基础设施。
    • 如果需要定制安全策略,可以通过自定义 WebSecurityConfigurerAdapter 来覆盖默认配置。

四、Spring Boot 自动配置的好处

  1. 极大地简化配置工作:开发者不再需要为每个基础设施组件编写配置代码,自动配置机制根据项目依赖自动注入所需的 Bean。
  2. 灵活性:自动配置并不会束缚开发者。开发者可以通过自定义配置轻松覆盖默认的自动配置。
  3. 约定优于配置:Spring Boot 遵循 "约定优于配置" 的原则,只需少量的配置,Spring Boot 就能完成复杂的初始化工作。

五、Spring Boot 自动配置与 Spring 自动装配的区别

  • Spring 自动装配:指通过 @Autowired 等注解,根据类型自动注入依赖 Bean。它侧重于注入已经配置好的 Bean。
  • Spring Boot 自动配置:是根据类路径中的依赖和环境信息自动配置 Spring 组件的过程。它负责创建并配置所需的基础设施 Bean。

总结来说,Spring Boot 的自动配置机制通过 @EnableAutoConfiguration 启动,基于 spring.factories 中的配置和 @Conditional 条件判断,自动注入所需的 Bean,简化了开发者的配置工作,同时保留了灵活的定制能力。

一文彻底弄懂spring boot自动转配的过程的更多相关文章

  1. Spring Boot自动配置原理懂后轻松写一个自己的starter

    目前很多Spring项目的开发都会直接用到Spring Boot.因为Spring原生开发需要加太多的配置,而使用Spring Boot开发很容易上手,只需遵循Spring Boot开发的约定就行了, ...

  2. Spring Boot自动配置原理(转)

    第3章 Spring Boot自动配置原理 3.1 SpringBoot的核心组件模块 首先,我们来简单统计一下SpringBoot核心工程的源码java文件数量: 我们cd到spring-boot- ...

  3. Spring Boot自动装配

    前言 一些朋友问我怎么读源码,这篇文章结合我看源码时候一些思路给大家聊聊,我主要从这三个方向出发: 确定目标,这个目标要是一个具体,不要一上来我要看懂Spring,这是不可能的,目标要这么来定,比如看 ...

  4. Spring Boot 自动装配流程

    Spring Boot 自动装配流程 本文以 mybatis-spring-boot-starter 为例简单分析 Spring Boot 的自动装配流程. Spring Boot 发现自动配置类 这 ...

  5. Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件

    本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...

  6. Springboot 系列(三)Spring Boot 自动配置原理

    注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 关于配置文件可以配置的内容,在 Spring ...

  7. Spring Boot自动配置与Spring 条件化配置

    SpringBoot自动配置 SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即 ...

  8. Spring Boot自动配置原理、实战

    Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...

  9. Spring Boot自动配置

    Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...

  10. Spring boot 自动配置自定义配置文件

    示例如下: 1.   新建 Maven 项目 properties 2.   pom.xml <project xmlns="http://maven.apache.org/POM/4 ...

随机推荐

  1. JAVA集合专题之深入学习

    1.背景 集合虽然用起来非常简单... 但是面试确问得很多,很深.... 最重要的是集合的设计里面使用了大量的非常典型的多线程设计... 如果能把集合中的源码学一遍,相信你的多线程功底会大大提升... ...

  2. maven实战教程-含视频讲解

    1.背景 2.什么是maven? 通俗的说就是,不用手动拷贝jar包,帮我们管理项目结构,只需要配置坐标,自动从中央仓库下载(其他介绍请百度...). 3.Maven的安装与配置 注意:Maven在使 ...

  3. Orleans初体验

    Orleans: 是一个跨平台框架,用于构建可靠且可缩放的分散式应用. 分布式应用定义为跨多个进程的应用,通常使用对等通信来超越硬件边界. 从单个本地服务器扩展到了云中数千个分布式.高度可用的应用. ...

  4. CH03_布局

    第3章:布局 本章目标 理解布局的原则 理解布局的过程 理解布局的容器 掌握各类布局容器的运用 理解 WPF 中的布局 WPF 布局原则 ​ WPF 窗口只能包含单个元素.为在WPF 窗口中放置多个元 ...

  5. 基于docker搭建单机测试ELK

    说明:本次使用的windows系统,利用vm进行安装虚拟机,安装的只是单测试单机版elk. 一.下载vm 自行官网下载 二.安装centos7系统 自己有现成的镜像跳过,没有自行查找资料完成 三.进行 ...

  6. CAN学习笔记(一)CAN入门

    CAN学习笔记(一)CAN入门 参考链接:https://blog.csdn.net/2301_77952570/article/details/131114941 CAN收发器的作用 发:将TTL电 ...

  7. [golang]查询ssl证书剩余有效天数并邮件提醒

    前言 自从云厂商的免费ssl证书改成3个月,而且证书数量还是20个之后,自己网站的ssl证书就换成了其它免费方案.但是免费方案不会提醒证书过期,所以写个工具每天定时查询证书剩余有效天数,如果证书即将过 ...

  8. ChatGPT学习之旅 (10) 系统全球化小助手

    大家好,我是Edison. 上一篇我们写了一个运维小助手的prompt,它帮我们写一些我们开发者不太愿意做的一些运维小任务.这一篇,给大家分享下我在日常的系统开发中遇到的多语言/全球化的任务中是如何通 ...

  9. C#自定义控件—转换开关

    C#用户控件之转换开关 如何自定义一个转换键(Toggle)? 三步绘制一个精美控件: 定义属性: 画布重绘: 添加事件: 主要技能: 如何自定义属性: 画布重绘的一般格式: 控件的事件触发过程: 技 ...

  10. 超轻量级、支持插件的 .NET 网络通信框架

    前言 给大家推荐一个轻量级的.支持插件的综合网络通信库:TouchSocket. TouchSocket 的基础通信功能包括 TCP.UDP.SSL.RPC 和 HTTP.其中,HTTP 服务器支持 ...