SpringBoot自动配置原理

前言

Spring Boot 的自动配置是其核心特性之一,它简化了 Spring 应用程序的配置,使得开发者能够快速启动和运行 Spring 应用,而无需手动编写大量的配置代码。

Spring Boot 自动配置的基本概念

自动配置(Auto-Configuration):Spring Boot 提供了一系列的自动配置类,这些类会根据项目依赖和运行环境中的条件自动地创建并配置 Spring Bean。

条件化配置:自动配置是基于条件的,例如,仅当某个类在类路径中存在时,或仅当某个 Bean 未定义时才应用某个自动配置类。这些条件通常由 @Conditional 系列注解来实现,如 @ConditionalOnClass、@ConditionalOnMissingBean 等。

启动类的核心注解

在 Spring Boot 项目中的引导类上有一个注解 @SpringBootApplication ,这个注解是对三个注解进行了封装,分别是:

  • @SpringBootConfiguration ➡️该注解与 @Configuration 注解作用相同,用来声明当前也是一个配置类

  • @EnableAutoConfiguration ➡️Spring Boot 实现自动化配置的核心注解

  • @ComponentScan ➡️组件扫描,默认扫描当前引导类所在包及其子包。

其中@EnableAutoConfiguration是实现自动化配置的核心注解。

@SpringBootApplication
public class TestApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class,args);
    }

在这里插入图片描述

自动装配的核心注解

@EnableAutoConfiguration 是实现自动装配的重要注解,该注解通过@Import注解导入对应的配置选择器。关键的是内部就是读取了该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。

在这里插入图片描述
实际上关键在 @Import 注解,它会加载 AutoConfigurationImportSelector类,
通过 AutoConfigurationImportSelector 类来实现自动装配。
AutoConfigurationImportSelector 的作用是加载自动装配类。它会扫描 META-INF/spring.factories中配置的类,并将这些符合条件的类实例化成 Bean,然后交给 Spring 容器管理。

在这里插入图片描述

在这里插入图片描述

AutoConfigurationImportSelector类中关键方法selectImports

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

selectImports 方法是其中的一个关键方法。让我们逐步分析它的作用:
首先,它检查是否启用了自动装配。如果没有启用,直接返回一个空数组。
然后,调用函数getAutoConfigurationEntry获取自动装配的配置项,即 AutoConfigurationEntry。
最后,它将 AutoConfigurationEntry 中配置的类转换为字符串数组并返回。

selectImports调用了getAutoConfigurationEntry函数,重点关注这个函数。

    protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            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);
            configurations = this.getConfigurationClassFilter().filter(configurations);
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            return new AutoConfigurationEntry(configurations, exclusions);
        }
    }

首先,它检查是否启用了自动配置。如果没有启用,直接返回一个空的 AutoConfigurationEntry。
然后,它获取 @EnableAutoConfiguration 注解的属性,即 AnnotationAttributes。
接下来,它从 spring.factories 文件中获取配置类的全限定名数组。
去除重复的配置类。
在这里插入图片描述

获取需要排除的类的全限定名的集合
在这里插入图片描述

检查排除的类是否在配置类中,如果存在则移除。
使用配置类过滤器过滤配置类。
最后,创建一个 AutoConfigurationEntry 对象,包含配置类和排除的类。

getAutoConfigurationEntry 方法的核心是获取需要自动配置的 Bean 的信息,以便在 Spring Boot 启动时将这些 Bean 实例化并交给 Spring 容器管理。

总结

在 Spring Boot 中,@SpringBootApplication 注解用于引导和配置应用,它实际上是三个注解的组合:

  1. @SpringBootConfiguration:指定这是一个 Spring Boot 配置类,相当于 @Configuration
  2. @EnableAutoConfiguration:启用自动配置,核心注解,通过读取 META-INF/spring.factories 文件自动配置项目。
  3. @ComponentScan:自动扫描项目中的组件,如 @Controller@Service 等,通常不需要额外配置。

自动配置的工作原理

  • @EnableAutoConfiguration 注解使用 @Import 注解导入配置选择器。
  • 配置选择器会读取 META-INF/spring.factories 文件中的配置类列表。
  • Spring Boot 根据这些配置类中的条件注解(如 @ConditionalOnClass)判断是否需要将这些配置类的 Bean 注册到 Spring 容器中。

❤觉得有用的可以留个关注~❤

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot自动配置原理简述 SpringBoot自动配置SpringBoot的一大特色,它提供了一种简洁的方式来配置应用程序。在SpringBoot中,我们可以通过添加特定的依赖来自动配置应用程序的各种组件,例如数据源、日志、Web服务等。使用自动配置可以大大简化应用程序的配置过程,减少开发人员的工作量,提高开发效率。 自动配置的实现原理是基于Spring的条件化配置机制。SpringBoot会根据应用程序的依赖和当前环境自动配置各种组件。条件化配置可以通过在类上添加@Conditional注解来实现,该注解可以指定一个条件类,只有满足该条件类的条件时,才会进行配置。例如,以下代码示例中,只有当classpath中存在H2数据库驱动程序时,才会自动配置H2的数据源。 @Configuration @ConditionalOnClass(org.h2.Driver.class) public class H2DataSourceAutoConfiguration { // 配置H2数据源 } 除了依赖条件外,SpringBoot还支持很多其他条件,例如环境条件、属性条件、Bean条件等。通过组合这些条件,可以实现更加灵活的自动配置。例如,以下代码示例中,只有当当前环境为开发环境时,才会自动配置开发环境的日志。 @Configuration @Profile("dev") public class DevLoggerAutoConfiguration { // 配置开发环境的日志 } 总之,SpringBoot自动配置机制是基于Spring的条件化配置机制实现的,它可以根据应用程序的依赖和当前环境自动配置各种组件,大大简化了应用程序的配置过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值