【应用】SpringBoot-自动配置原理

本文详细解释了SpringBoot中@SpringBootApplication启动类的自动配置原理,涉及@EnableAutoConfiguration注解、Import注解的作用以及AutoConfigurationImportSelector类在自动配置过程中的关键作用,包括候选配置列表的生成和筛选机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本文简要介绍SpringBoot的自动配置原理。

本文讲述的SpringBoot版本为:3.1.2。

前置知识

在看原理介绍之前,需要知道@Import注解的作用:

  • 可以导入@Configuration注解的配置类、声明@Bean注解的bean方法;
  • 可以导入ImportSelector的实现类;【自动配置原理用到注解的这个作用】
  • 可以导入ImportBeanDefinitionRegistrar的实现类。

原理介绍

从启动类入手

一个常规的SpringBoot项目的启动类内容如下

image-20240411160551186

从启动类上的@SpringBootApplication入手

image-20240411160719344

三个注解箭头指示的注解,各有各的作用:

  • @SpringBootConfiguration:组合了@Configuration注解,表示这是一个配置类
  • @EnableAutoConfiguration:允许自动配置
  • @ComponentScan:Spring的组件扫描,默认扫描main方法所在类所在的包及其子包

其中第二个注解@EnableAutoConfiguration是实现自动配置的关键。

@EnableAutoConfiguration注解入手

image-20240411161048600

可以看到该注解中有一个@Import注解,先说结论:在AutoConfigurationImportSelector类中加载了哪些需要自动配置的Bean,并完成加载,注入到IOC容器中。

到AutoConfigurationImportSelector类

AutoConfigurationImportSelector类入手

image-20240411161526906

可以看出:AutoConfigurationImportSelector类是org.springframework.boot.autoconfigure包下的一个类,实现了DeferredImportSelector等接口

  • org.springframework.boot.autoconfigure:望名生意,自动配置,就是在该包里面,规定了哪些Bean需要配置。
  • DeferredImportSelector:该接口是实现自动配置的关键,里面的selectImports方法规定了哪些Bean需要自动配置。

往下滑,看AutoConfigurationImportSelector类的selectImports方法

image-20240411162621664

红框所示代码:返回了需要自动配置的Bean列表。

this.getAutoConfigurationEntry方法入手

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return EMPTY_ENTRY;
    } else {
        AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
        
        // 获取该类所在包下的META-INF/spring/目录中以.imports为后缀结尾的文件里面的内容,作为候选配置列表
        List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
        
        // 去除重复的配置
        configurations = this.removeDuplicates(configurations);
        
        // 排除部分元注解信息中需要排除的配置
        Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
        this.checkExcludedClasses(configurations, exclusions);
        configurations.removeAll(exclusions);
        
        // 过滤掉一些暂时不生效的配置:加了如下注解的bean:@OnxxxCondition
        configurations = this.getConfigurationClassFilter().filter(configurations);
        this.fireAutoConfigurationImportEvents(configurations, exclusions);
        return new AutoConfigurationEntry(configurations, exclusions);
    }
}

该方法中代码的逻辑如上。就剩一个this.getCandidateConfigurations方法需要再探究,里面规定了从哪个地方寻找需要配置的bean列表。

this.getCandidateConfigurations方法入手

image-20240411163754007

再进入箭头所指向的load方法

image-20240411163828626

可以看到:该方法往包下的META-INF/spring/目录中寻找后缀名为.imports的文件。

到org.springframework.boot.autoconfigure包中看看

从idea左侧的依赖列表里面查看:

image-20240411164032607

image-20240411164117630

点开文件里面任意一个类:

image-20240411164350208

image-20240411164415793

都是一个自动配置类,定义有相应的Bean方法。

至此,SpringBoot的自动配置原理就明白了。

原理总结

  • 启动类中有一个@SpringBootApplication注解,包含了@EnableAutoConfiguration代表开启自动装配
  • @EnableAutoConfiguration注解里面组合了一个@Import注解,这个注解是实现自动配置的关键。
  • @Import注解最终的作用可以总结如下:到spring-boot-autoconfigure包下的META-INF/spring目录中寻找.imports结尾的文件,这里面列举了所有需要自动配置的类,程序会读取这些类并加载(但这些类不会全部加载,因为有的类上面有条件注解,需要满足特定条件时才会生效)
    • spring-boot-autoconfigure包下的AutoConfigurationImportSelector类实现了ImportSelector,并重写了selectImports方法
    • selectImports方法中,定义类自动配置类的加载位置。还有一些配置类的去重操作、排除操作等。
### Spring Boot 自动配置原理 Spring Boot自动配置机制是其核心功能之一,旨在减少开发人员的手动配置负担。它通过分析项目的依赖关系和环境变量,动态地为应用程序提供合理的默认配置。 #### 1. 基于 `@SpringBootApplication` 注解的触发 注解 `@SpringBootApplication` 是 Spring Boot 应用程序的核心入口点。该注解隐含了另一个重要注解——`@EnableAutoConfiguration`[^4]。而 `@EnableAutoConfiguration` 则进一步引入了 `EnableAutoConfigurationImportSelector` 类来加载自动配置类列表[^4]。 #### 2. 使用 `spring.factories` 文件定位自动配置Spring Boot自动配置主要依赖于 `META-INF/spring.factories` 文件中的定义。此文件列出了所有可能参与自动配置的候选类。这些类通常以 `*AutoConfiguration` 结尾,并实现了特定的功能模块初始化逻辑[^1]。 当应用启动时,框架会扫描并加载这些自动配置类,同时根据条件判断哪些类适用于当前运行环境。这种条件匹配由一系列内置的 `@Conditional` 注解支持,例如: - `@ConditionalOnClass`: 当指定的类存在于类路径中时生效。 - `@ConditionalOnMissingBean`: 当容器中不存在某个 Bean 时才创建新的实例。 - `@ConditionalOnProperty`: 根据配置文件中的属性值决定是否启用某项功能。 #### 3. 配置类后处理器的作用 在 Spring 容器初始化阶段,`ConfigurationClassPostProcessor` 被注册到上下文中执行必要的处理操作。这一组件负责解析带有 `@Configuration` 或其他相关注解的 Java 配置类,并将其转换成实际可用的 Bean 定义对象。 此外,在整个过程中还会涉及到一些辅助工具类如 `AutoConfigurationPackages` 和方法调用链路的支持[^3]。 综上所述,Spring Boot 自动化配置流程大致可以概括如下几个关键环节: - **注解驱动**:从根级@SpringBootApplication出发逐层展开; - **资源发现**:借助spring.factories文件获取潜在可选方案集合; - **策略筛选**:运用多种Conditionals限定符精确挑选最适配选项; 最终达成智能化零侵入式的高效部署模式. ```java // 示例代码展示如何利用@EnableAutoConfiguration实现自定义扩展 import org.springframework.context.annotation.Configuration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @Configuration @EnableAutoConfiguration public class MyCustomConfig { // 可在此处添加额外业务逻辑或覆盖已有行为... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值