Spring Boot到底是如何进行自动配置的?

【1】从 spring.factories 配置文件中加载 EnableAutoConfiguration 自动配置类),获取的自动配

置类如图所示。

【2】若 @EnableAutoConfiguration 等注解标有要 exclude 的自动配置类,那么再将这个自动配置类

排除掉;

【3】排除掉要 exclude 的自动配置类后,然后再调用 filter 方法进行进一步的过滤,再次排除一些

不符合条件的自动配置类;

【4】经过重重过滤后,此时再触发 AutoConfigurationImportEvent 事件,告诉
ConditionEvaluationReport 条件评估报告器对象来记录符合条件的自动配置类;

【5】 最后再将符合条件的自动配置类返回。

AutoConfigurationImportSelectorfilter 方法主要做的事情就是调用
AutoConfigurationImportFilter 接口的 match 方法来判断每一个自动配置类上的条件注解(若有

的话) @ConditionalOnClass , @ConditionalOnBean@ConditionalOnWebApplication 是否满足

条件,若满足,则返回true,说明匹配,若不满足,则返回false说明不匹配。


我们再总结下SpringBoot自动配置的原理,主要做了以下事情:

1. 从spring.factories配置文件中加载自动配置类;
2. 加载的自动配置类中排除掉 @EnableAutoConfiguration 注解的 exclude 属性指定的自动配置
类;
3. 然后再用 AutoConfigurationImportFilter 接口去过滤自动配置类是否符合其标注注解(若有
标注的话) @ConditionalOnClass , @ConditionalOnBean
@ConditionalOnWebApplication 的条件,若都符合的话则返回匹配结果;
4. 然后触发 AutoConfigurationImportEvent 事件,告诉 ConditionEvaluationReport 条件评
估报告器对象来分别记录符合条件和 exclude 的自动配置类。
5. 最后spring再将最后筛选后的自动配置类导入IOC容器中


GPT回答

Spring Boot的自动配置是通过条件化配置(Conditional Configuration)和约定优于配置(Convention over Configuration)的原则来实现的。

  1. 条件化配置:Spring Boot会根据当前应用的环境和类路径上的依赖,判断是否需要自动配置某个组件。它会通过条件注解(如@ConditionalOnClass、@ConditionalOnBean、@ConditionalOnProperty等)来定义条件,只有在满足条件的情况下才会进行自动配置。

  2. 约定优于配置:Spring Boot根据一些约定来进行自动配置,而不需要显式的配置。它会根据类路径上的依赖、配置文件、注解等信息,自动推断和加载合适的配置。比如,如果在类路径上存在HikariCP依赖,Spring Boot会自动配置HikariCP作为默认的数据库连接池。

在自动配置过程中,Spring Boot会扫描应用程序的类路径上的META-INF/spring.factories文件,该文件中定义了各个自动配置类的全限定名。Spring Boot会根据这些配置类来进行自动配置。

自动配置类通常使用@Configuration注解进行标注,并且使用各种注解(如@Bean、@EnableConfigurationProperties等)来进行具体的配置。这些自动配置类会根据条件判断来决定是否进行自动配置。

另外,Spring Boot还提供了@ConfigurationProperties注解,用于将配置文件中的属性值绑定到对应的Java对象上。通过@ConfigurationProperties注解,我们可以方便地自定义配置,并在自动配置过程中使用。

总之,Spring Boot的自动配置通过条件化配置和约定优于配置的原则,根据应用的环境、依赖和配置文件等信息,自动加载和配置相应的组件,以简化开发者的配置工作。

相关推荐
陈无左耳、23 分钟前
Spring Boot应用开发实战:从入门到精通
spring boot
我要学编程(ಥ_ಥ)31 分钟前
初始JavaEE篇 —— 网络原理---传输层协议:深入理解UDP/TCP
java·网络·tcp/ip·udp·java-ee
就爱学编程31 分钟前
重生之我在异世界学编程之C语言:数据在内存中的存储篇(下)
java·服务器·c语言
烟波人长安吖~37 分钟前
【目标跟踪+人流计数+人流热图(Web界面)】基于YOLOV11+Vue+SpringBoot+Flask+MySQL
vue.js·pytorch·spring boot·深度学习·yolo·目标跟踪
运维&陈同学1 小时前
【Kibana01】企业级日志分析系统ELK之Kibana的安装与介绍
运维·后端·elk·elasticsearch·云原生·自动化·kibana·日志收集
yuanbenshidiaos1 小时前
C++--------------树
java·数据库·c++
俎树振1 小时前
Java数组深入解析:定义、操作、常见问题与高频练习
java·开发语言
花心蝴蝶.1 小时前
Map接口 及其 实现类(HashMap, TreeMap)
java·数据结构
小天努力学java2 小时前
【面试系列】深入浅出 Spring
java·spring·面试
Just_Paranoid2 小时前
解析 Java 项目生成常量、变量和函数 Excel 文档
java·python·正则表达式·excel·javadoc