• 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的自动配置通过条件化配置和约定优于配置的原则,根据应用的环境、依赖和配置文件等信息,自动加载和配置相应的组件,以简化开发者的配置工作。

  • 相关阅读:
    尚医通【预约挂号系统】总结
    51单片机OLED收银电子秤称重计价清零去皮金额累计HX711
    JavaScript 对象
    MySQL常见报错
    STM32F4x_中断配置
    Matplotlib补充:科研绘图利器(写论文、数据可视化必备)
    使用ffmpeg解码音频sdl(pull)播放
    你是否正确地编写了 Git 提交信息?
    前后端分离的后台管理系统源码,快速开发OA、CMS网站后台管理、毕业设计项目
    C++线程同步
  • 原文地址:https://blog.csdn.net/zhangzhanbin/article/details/136228251