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

SpringBoot自动配置原理解析

文章目录

  • 前言
  • SpringBoot自动配置概述
  • 自动配置的核心注解
    • @SpringBootApplication注解
    • @EnableAutoConfiguration注解解析
    • AutoConfigurationImportSelector核心实现
    • selectImports方法分析
    • getAutoConfigurationEntry方法详解
    • getCandidateConfigurations方法
  • SpringFactoriesLoader机制
    • loadFactoryNames方法实现
    • loadSpringFactories方法核心逻辑
    • spring.factories文件格式
    • 条件注解机制
  • 自动配置的执行流程
  • 总结

前言

SpringBoot作为Spring生态系统中的重要组成部分,其最大的特色就是约定优于配置的设计理念,而自动配置机制正是这一理念的核心体现。通过自动配置,SpringBoot能够根据项目中的依赖和配置,自动装配相应的Bean,极大地简化了传统Spring项目的配置工作。

SpringBoot自动配置概述

SpringBoot自动配置是一套智能化的配置机制,它能够根据classpath中存在的jar包、配置文件中的属性值以及其他条件,自动为应用程序配置相应的Bean。这种机制让开发者无需编写大量的XML配置文件或Java配置类,就能快速搭建一个功能完整的Spring应用。自动配置的核心思想是通过条件注解来判断是否需要创建某个Bean。只有当特定条件满足时,相应的配置类才会生效,Bean才会被创建并加入到Spring容器中。

自动配置的核心注解

@SpringBootApplication注解

SpringBoot应用的入口点通常标注有@SpringBootApplication注解,这个注解是一个复合注解,包含了三个重要的注解:

在这里插入图片描述

其中@EnableAutoConfiguration是自动配置的核心注解,它负责启动SpringBoot的自动配置机制。

@EnableAutoConfiguration注解解析

@EnableAutoConfiguration注解的源码如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";Class<?>[] exclude() default {};String[] excludeName() default {};
}

这个注解通过@Import导入了AutoConfigurationImportSelector类,这个类是自动配置机制的核心实现。

AutoConfigurationImportSelector核心实现

AutoConfigurationImportSelector类实现了ImportSelector接口,Spring容器会调用其selectImports方法来获取需要导入的配置类。

selectImports方法分析

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

这个方法首先检查自动配置是否启用,然后调用getAutoConfigurationEntry方法获取自动配置条目。

getAutoConfigurationEntry方法详解

源码如下:

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return EMPTY_ENTRY;}AnnotationAttributes attributes = getAttributes(annotationMetadata);List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);configurations = removeDuplicates(configurations);Set<String> exclusions = getExclusions(annotationMetadata, attributes);checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations = getConfigurationClassFilter().filter(configurations);fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationEntry(configurations, exclusions);
}

这个方法的执行流程包括以下几个步骤:

  1. 获取候选配置类列表
  2. 移除重复的配置类
  3. 获取排除的配置类
  4. 检查排除的配置类是否合法
  5. 从候选配置中移除排除的配置
  6. 通过过滤器进一步筛选配置类
  7. 触发自动配置导入事件
    在这里插入图片描述
    其实主要的就是getCandidateConfigurationsfilter方法,一个是来得到配置类的List集合,另一个是用来对过滤不符合条件注解的那些配置类。

getCandidateConfigurations方法

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "+ "are using a custom packaging, make sure that file is correct.");return configurations;
}

这个方法通过SpringFactoriesLoader.loadFactoryNames方法从META-INF/spring.factories文件中加载所有的自动配置类。

SpringFactoriesLoader机制

SpringFactoriesLoader是SpringBoot中一个重要的工具类,它负责从classpath下的META-INF/spring.factories文件中加载配置信息。

loadFactoryNames方法实现

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {ClassLoader classLoaderToUse = classLoader;if (classLoaderToUse == null) {classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();}String factoryTypeName = factoryType.getName();return loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());
}

loadSpringFactories方法核心逻辑

在这里插入图片描述
通过SpringFactoriesLoader来加载META-INF/spring.factories文件中的所有自动配置类,并将其缓存起来。

spring.factories文件格式

spring.factories文件采用Properties格式,其中key是接口或抽象类的全限定名,value是实现类的全限定名列表。以spring-boot-autoconfigure包中的spring.factories为例:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
...

条件注解机制

SpringBoot自动配置的智能之处在于条件注解的使用。这些注解决定了配置类在什么条件下才会生效。

自动配置的执行流程

SpringBoot自动配置的完整执行流程可以概括为以下几个阶段:

  1. 首先是启动阶段。当Spring容器启动时,会处理@SpringBootApplication注解,进而处理@EnableAutoConfiguration注解。
  2. 然后是加载阶段。AutoConfigurationImportSelector被调用,从META-INF/spring.factories文件中加载所有候选的自动配置类。
  3. 接下来是过滤阶段。通过各种条件注解对候选的配置类进行过滤,只保留满足条件的配置类。
  4. 最后是实例化阶段。Spring容器实例化通过过滤的配置类,并创建相应的Bean。

总结

SpringBoot的自动配置机制通过条件注解、SpringFactoriesLoader、META-INF/spring.factories文件等技术,实现了智能化的Bean配置。它大大简化了Spring应用的配置工作,理解自动配置的原理不仅有助于更好地使用SpringBoot,也能帮助我们在必要时创建自己的自动配置,提高开发效率。

http://www.dtcms.com/a/346649.html

相关文章:

  • 本地文件夹即时变身 Web 服务器(文件服务器)
  • Linux问答题:归档和传输文件
  • Reactor 反应堆模式
  • 《解构React Server Components:服务端序列化与流式传输的底层逻辑》
  • 为什么在WHERE子句里使用函数,会让索引失效
  • 中农具身导航赋能智慧农业!AgriVLN:农业机器人的视觉语言导航
  • 【数据结构】计数排序:有时比快排还快的整数排序法
  • Linux PCI 子系统:工作原理与实现机制深度分析
  • 并查集详解
  • 第三阶段数据库-9:循环,编号,游标,分页
  • 【数据分析】宏基因组荟萃分析(Meta-analysis)的应用与实操指南
  • ES作为推荐库的设计原理
  • 配置npm国内源(包含主流npm镜像源地址)
  • Docker之nginx安装
  • 青少年机器人技术(五级)等级考试试卷(2020年9月)
  • docker的数据管理
  • 工作空间与功能包
  • 解读66页数字化转型数据中台规划应用实践解决方案【附全文阅读】
  • Q/DR/CX7.2-2020 是中国企业标准体系中
  • 【2025CVPR-目标检测方向】UniMamba:基于激光雷达的3D目标检测,采用分组高效曼巴语进行统一空间信道表示学习
  • Qt + windows+exe+msvc打包教程
  • 今日科技热点 | 量子计算突破、AI芯片与5G加速行业变革
  • Elasticsearch:什么是神经网络?
  • 算法训练营day59 图论⑨ dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
  • Redis Set 类型详解:从基础命令到实战应用
  • OpenJDK 17 安全点检查机制深入解析
  • 【AI基础:神经网络】16、神经网络的生理学根基:从人脑结构到AI架构,揭秘道法自然的智能密码
  • Photoshop CS6精简版轻量级,Photoshop CS6绿色免安装,Photoshop CS6安装教程
  • Kafka 概念与概述
  • AI热点周报(8.17~8.23):Pixel 10“AI周”、DeepSeek V3.1发布,英伟达再起波澜?