【1】从 spring.factories
配置文件中加载 EnableAutoConfiguration
自动配置类),获取的自动配
置类如图所示。
【2】若 @EnableAutoConfiguration
等注解标有要 exclude
的自动配置类,那么再将这个自动配置类
排除掉;
【3】排除掉要 exclude
的自动配置类后,然后再调用 filter
方法进行进一步的过滤,再次排除一些
不符合条件的自动配置类;
【4】经过重重过滤后,此时再触发 AutoConfigurationImportEvent
事件,告诉
ConditionEvaluationReport
条件评估报告器对象来记录符合条件的自动配置类;
【5】 最后再将符合条件的自动配置类返回。
AutoConfigurationImportSelector
的 filter
方法主要做的事情就是调用
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)的原则来实现的。
-
条件化配置:Spring Boot会根据当前应用的环境和类路径上的依赖,判断是否需要自动配置某个组件。它会通过条件注解(如@ConditionalOnClass、@ConditionalOnBean、@ConditionalOnProperty等)来定义条件,只有在满足条件的情况下才会进行自动配置。
-
约定优于配置:Spring Boot根据一些约定来进行自动配置,而不需要显式的配置。它会根据类路径上的依赖、配置文件、注解等信息,自动推断和加载合适的配置。比如,如果在类路径上存在HikariCP依赖,Spring Boot会自动配置HikariCP作为默认的数据库连接池。
在自动配置过程中,Spring Boot会扫描应用程序的类路径上的META-INF/spring.factories文件,该文件中定义了各个自动配置类的全限定名。Spring Boot会根据这些配置类来进行自动配置。
自动配置类通常使用@Configuration注解进行标注,并且使用各种注解(如@Bean、@EnableConfigurationProperties等)来进行具体的配置。这些自动配置类会根据条件判断来决定是否进行自动配置。
另外,Spring Boot还提供了@ConfigurationProperties注解,用于将配置文件中的属性值绑定到对应的Java对象上。通过@ConfigurationProperties注解,我们可以方便地自定义配置,并在自动配置过程中使用。
总之,Spring Boot的自动配置通过条件化配置和约定优于配置的原则,根据应用的环境、依赖和配置文件等信息,自动加载和配置相应的组件,以简化开发者的配置工作。