首页 > 编程语言 >Spring Boot 源码分析五:Spring Boot AutoConfiguration 自动配置机制

Spring Boot 源码分析五:Spring Boot AutoConfiguration 自动配置机制

时间:2024-06-22 12:58:35浏览次数:23  
标签:SpringBoot Spring 配置 Boot annotationMetadata 源码 自动 EnableAutoConfiguration confi

1. 引言

在前几篇文章中,我们探讨了 SpringBoot 的启动流程及其扩展机制。在本篇文章中,我们将深入分析 SpringBoot 的自动配置(AutoConfiguration)机制,这是 SpringBoot 最具特色和强大的功能之一。

2. 自动配置概述

SpringBoot 的自动配置机制旨在根据项目中的类路径和配置属性,自动配置 Spring 应用程序。通过自动配置,开发者无需编写大量的配置代码,就可以快速启动和运行 Spring 应用程序。

2.1 自动配置的工作原理

  • 条件注解:自动配置类使用条件注解(如 @ConditionalOnClass, @ConditionalOnMissingBean 等)来判断是否需要进行某些配置。

  • 配置文件:自动配置类通常会读取配置文件中的属性,并根据这些属性进行配置。

  • 优先级:通过 @AutoConfigureOrder 注解来控制自动配置类的优先级。

2.2 自动配置的入口

自动配置的入口位于 spring.factories 文件中。SpringBoot 使用 SpringFactoriesLoader 加载这些自动配置类。

spring.factories 文件示例
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration

3. EnableAutoConfiguration 注解

3.1 @EnableAutoConfiguration 定义

@EnableAutoConfiguration 是 SpringBoot 自动配置的核心注解,它用于启用自动配置功能。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    // 排除特定的自动配置类
    Class<?>[] exclude() default {};

    // 排除特定的自动配置类名称
    String[] excludeName() default {};
}
  • @AutoConfigurationPackage:用于自动配置包扫描路径。

  • @Import(AutoConfigurationImportSelector.class):导入 AutoConfigurationImportSelector,该类用于收集和注册自动配置类。

3.2 @SpringBootApplication 注解

@SpringBootApplication 注解是一个复合注解,包含了 @EnableAutoConfiguration。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
    @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
    @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    // ...
}

4. AutoConfigurationImportSelector 类

AutoConfigurationImportSelector 类负责从 spring.factories 文件中加载自动配置类,并将其导入到 Spring 应用上下文中。

4.1 selectImports 方法

selectImports 方法是 AutoConfigurationImportSelector 的核心方法,它负责选择要导入的自动配置类。

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
    if (!isEnabled(annotationMetadata)) {
        return NO_IMPORTS;
    }
    AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
    AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
    return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
  • isEnabled:检查自动配置是否启用。

  • AutoConfigurationMetadataLoader:加载自动配置元数据。

  • getAutoConfigurationEntry:获取自动配置条目。

4.2 getAutoConfigurationEntry 方法

getAutoConfigurationEntry 方法用于获取自动配置类的条目。

protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,
                                                           AnnotationMetadata annotationMetadata) {
    if (!isEnabled(annotationMetadata)) {
        return EMPTY_ENTRY;
    }
    AnnotationAttributes attributes = getAttributes(annotationMetadata);
    List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
    configurations = removeDuplicates(configurations);
    configurations = sort(configurations, autoConfigurationMetadata);
    Set<String> exclusions = getExclusions(annotationMetadata, attributes);
    checkExcludedClasses(configurations, exclusions);
    configurations.removeAll(exclusions);
    configurations = filter(configurations, autoConfigurationMetadata);
    fireAutoConfigurationImportEvents(configurations, exclusions);
    return new AutoConfigurationEntry(configurations, exclusions);
}
  • getCandidateConfigurations:获取候选的自动配置类。

  • removeDuplicates:移除重复的配置类。

  • sort:对配置类进行排序。

  • getExclusions:获取排除的配置类。

  • checkExcludedClasses:检查排除的配置类。

  • filter:过滤配置类。

  • fireAutoConfigurationImportEvents:触发自动配置导入事件。

5. 创建自定义自动配置

5.1 编写自动配置类

编写一个自动配置类,并使用 @Configuration 和条件注解。

@Configuration
@ConditionalOnClass(MyService.class)
@ConditionalOnMissingBean
public class MyAutoConfiguration {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

5.2 配置 spring.factories 文件

在 META-INF/spring.factories 文件中配置自动配置类。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration

 

6. 结论

通过深入分析 SpringBoot 的自动配置机制,我们了解了其工作原理和实现细节。自动配置机制是 SpringBoot 强大和易用的关键,它能够根据项目需求自动配置各种组件,大大简化了开发过程。在接下来的文章中,我们将继续探讨 SpringBoot 的其他重要特性和实现细节。

标签:SpringBoot,Spring,配置,Boot,annotationMetadata,源码,自动,EnableAutoConfiguration,confi
From: https://blog.csdn.net/weixin_53391173/article/details/139840696

相关文章